一、为什么要继承?
继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展和增加新功能,这样产生新的类,称派生类。
继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。
二、继承的语法
修饰符 class 子类 extends 父类 {
// ...
}
三、super关键字
1.继承成员时遵循就近原则,自己有优先自己的,如果没有则向父类中找。若父类和子类都没有定义,则编译报错。
继承方法时:
通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到 则访问,否则编译报错。
通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错;
2.问:如果子类中存在与父类中相同的成员时,那如何在子类中访问父类相同名称的成员呢?
答:java提供了super关键字:表示的是从父类继承过来的数据的引用,增强了可读性
指定告诉编译器,访问的的是父类中的(父子类中有相同变量时)
// 访问父类的成员变量时,需要借助super关键字
// super是获取到子类对象中从基类继承下来的部分
super.a = 200;
super.b = 201;
// 父类和子类中构成重载的方法,直接可以通过参数列表区分清访问父类还是子类方法
methodA(); // 没有传参,访问父类中的methodA()
methodA(20); // 传递int参数,访问子类中的methodA(int)
// 如果在子类中要访问重写的基类方法,则需要借助super关键字
methodB(); // 直接访问,则永远访问到的都是子类中的methodA(),基类的无法访问到
super.methodB(); // 访问基类的methodB(
四、子类构造方法
1.子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。
2.子类继承父类之后,要先对父类进行成员的初始化(使用构造方法)
实例代码块和静态代码块执行顺序:
无继承关系时:静态代码块执行-实例代码块执行-构造方法执行
1) 静态代码块先执行,并且只执行一次,在类加载阶段执行
2)当有对象创建时,才会执行实例代码块,实例代码块执行完成后,最后构造方法执行
有继承关系时:
1)父类静态代码块优先于子类静态代码块执行,且是最早执行
2)父类实例代码块和父类构造方法紧接着执行
3)子类的实例代码块和子类构造方法紧接着再执行
4)第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行
ps:
1)若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法
2)如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。
3)在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。
4) super(...)只能在子类构造方法中出现一次,并且不能和this同时出现
3.super和this的区别?
同:
1)都是Java中的关键字
2)只能在类的非静态方法中使用,用来访问非静态成员方法和字段
3)在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在
异:
1)super.父类成员 1)this.当前类的成员变量
2)super.父类成员方法 2)this.当前类的成员变量方法
3)super.父类的构造方法 3)this.当前类的构造方法
4.java不支持多继承,c++支持,为解决这个问题,java引入了接口
五、protected关键字
为了实现封装特性,Java中引入了访问限定符,
主要限定:类或者类中成员能否在类外或者其他包中被访问。
protected可访问的:同一包的同一类
同一包的不同类
不同包中的子类
五、final关键字
我们并不希望类之间的继承层次太复杂. 一般我们不希望出现超过三层的继承关系. 如果继承层 次太多, 就需要考虑对代码进行重构了,因此有了final关键字。
1. 修饰变量或字段,表示常量(即不能修改)
final int a = 10;
a = 20; // 编译出错
2. 修饰类:表示此类不能被继承,称为密封类
final public class Animal {
...
}
public class Bird extends Animal {
...
}
// 编译出错
Error:(3, 27) java: 无法从最终com.bit.Animal进行继
3.修饰方法:当前方法不能被重写
六、组合
继承表示对象之间是is-a的关系,比如:狗是动物,猫是动物
组合表示对象之间是has-a的关系,比如:汽车
七、多态
通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状 态。
同一个引用调用了同一个方法,但因为引用的对象的不同而导致所表现的行为不同,我们把这种思想称为多态。
1.向上转型-发生多态的条件之一
当父类对象无法调用子类方法时:
Animal animal = new Dog (旺财,1,黄色)
//父类引用 引用了子类对象
//向上转型
1)直接赋值
2)通过传参
3)通过返回值
2.父类引用子类对象,通过父类引用去调用和子类同名的方法,此时调用的是子类的方法,这个过程叫做动态绑定。这是理解多态的基础!
静态绑定:如重载,是编译时期绑定的,根据给的参数不一样,来确定调用哪个方法。
3.重写:1)方法名相同
2)参数列表相同(顺序,个数,类型)
3)返回值相同
ps被final修饰,被static修饰,被private修饰的的方法不能被重写
3.1重写规则
1)
2)
3)