继承相关知识
什么是继承
- 什么是继承:继承就是将相同属性和行为的类向上提取,形成父类。
- 继承语法:使用extends关键字,public class Cat extends Animal {…}
- 语言特点:
- 在Java中,支撑但继承(也就是说一个子类只能继承一个父类)。
- 一个父类可以有多个子类继承。
- 支持多层继承。
- 父类的构造方法不参与继承。
- 父类私有化的变量不参与继承。
- 优点与缺点:
- 优点(提高代码的复用性,维护性【指的是:修改父类逻辑,子类逻辑也跟随变化】)
- 缺点:类与类之间产生了父子关系,增加了耦合性。(软件设计的原则是:高内聚,低耦合)
- 变量访问原则:
- 变量访问依据就近原则:现在局部范围寻找,有就是用,没有就在本类成员范围寻找,有就使用,没有就在父类范围寻找,有就是用,没有就报错。
- 如果所有变量名都相同时,就只能访问就近的局部变量。
- 要想访问其他变量就要使用关键字:this表示本类对象引用(this.变量名—就会访问本类变量),super表示父类引用(super.变量名----就会访问父类变量)
构造方法的调用
- 有了继承之后,子类在初始化的时候可能用到父类的数据,所以会先初始化父类。
- 所以子类里面必须有调父类构造方法的逻辑,因此构造方法默认第一个语句体就是:super(),【它就是调父类的空参构造方法语句】
- 这就就会一直向上调取构造方法:因此Java中有一个顶层的父类【object】,这就是最终的父类。
- 当我们创建构造方法时:就在语句体的第一行默认写出super(),但是当父类没有无参构造时(就会出现下列报错)
解决方法:
- 创造无参构造。
- 通过有参构造简介完成父类的初始化。
- 子类的无参构造中,访问父类的有参构造也可以完成父类的初始化。
Cat cat = new Cat();
创建对象是。类的加载顺序
1.先是父类的class文件加载,然后是子类的class文件夹加载。
2.执行父类的构造方法,再执行子类的构造方法。方法重写
方法重写
- 什么是方法重写:
- 当子类和父类出现相同方法时(方法名,返回值类型,返回值三者相同时就是相同方法),就会发生子类方法覆盖父类方法,这就是方法重写。
- 方法重写的用途:1.当对父类的方法执行的功能不满意或者想要扩展功能时,子类可以通过方法重写完成新的逻辑功能。
- 方法重写的快捷方式:ctrl +o ,重写父类方法
@Override
public void sleep() {
System.out.println("重写父类方法");
}
- 扩展父类方法:
@Override
public void sleep() {
super.sleep();
System.out.println("扩展功能逻辑");
}
注意:
super.sleep();是继承父类方法的语句。
@Override 是方法重写的判断提示。
//父类方法
private void sleep(){
System.out.println("睡觉");
}
//子类方法
@Override
public void sleep() {
System.out.println("重写父类方法");
}
注意:虽然子类的方法名,返回值,返回值类型和父类的相同,但是这不是方法重写,因为父类的方法是私有的,不能被继承。@Override会提示。
- 方法重写的注意事项:
- 父类的私有方法不能重写,因为私有方法不能继承。
- 父类的方法的权限修饰应该小于或者等于子类的方法权限修饰,最好权限是一致的。
- 父类的方式是静态的,子类的方法也要是静态的(其实算不上重写,因为静态方法,是随着类的加载而加载的)
final关键字
- 为什么出现final关键字,因为父类的有些信息不想被子类重写,就用final修饰,意为最终的意思。
- final可以修饰:变量、方法、类。
- final修饰后的特点:
- 修饰类:类不能被继承
- 修饰方法:方法不能被重写
- 修饰变量:变量不能被重新赋值
修饰局部变量
- 基本类型的变量:不能重新赋值
- 引用类型的变量:引用类型的地址值不能被修改。
)
多态基本知识:
- 概念:多态就是不同事物在不同时刻的状态。
Cat cat=new Cat(); 猫在某个时刻是猫
Animal a=new Cat(); 也可以在某个时刻是动物 - 多态的前提;
- 要有继承
- 要有方法重写(没有语法不会报错,但是多态就没有意义)。
- 要有父类引用 指向子类对象(Father fu=new Son();).
多态中的成员访问特点:
- Father fu = new Son();
编译 | 运行(结果) | |
成员变量 | 左边(父类) | 左边(父类) |
成员方法 | 左边(父类) | 右边(子类) |
静态方法 | 左边(父类) | 左边(父类) |
构造方法:子类创建对象是,会先访问父类构造方法,初始化父类数据。
- 多态的好处:
- 提高了代码的复用性(继承保证)
- 提高了代码的扩展性(多态保证)
- 多态的弊端:
- 多态形式不能使用子类特有的功能。
- 解决方法:向下转型。把父类引用强制转化为子类引用(Zi zi= (Zi) fu);
- 向上转型:就是把子类转成父类引用(多态本身就是向上转)
分析:
class A {
public void show() {
show2();
}
public void show2() {
System.out.println("我");
}
}
class B extends A {
public void show2() {
System.out.println("爱");
}
}
class C extends B {
public void show() {
super.show();
}
public void show2() {
System.out.println("你");
}
}
public class DuoTaiTest4 {
public static void main(String[] args) {
A a = new B();
a.show();
B b = new C();
b.show();
}
} 结果:爱 你
抽象类的概念和特点:
- 概念:我们在上述案例中提出了具体对象 猫 ,狗 等。向上抽取到动物类,但是动物类中我们给出了具体的吃饭,睡觉等方法,其实对于抽象的动物我们不应该给出具体的方法。而是应该给一个声明即可。
- 在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
- 抽象类和方法必须abstract修饰,
- 抽象类的特点:
- 抽象类不一定有抽象方法,抽象方法所在的类一定是抽象类
- 抽象类可以有构造方法,但是不能实例化,那么构造方法有什么用,
- 用于子类访问父类数据的初始化
- 抽象类不能直接实例化,该怎么实例化
- 利用多态的方式,有具体的子类进行实例化。
- 抽象类的子类
- 要么是抽象类
- 要么重写抽象类中的所有抽象方法