继承
使用细节
1.子类继承了所有的属性和方法(属性包括在父类中已经被赋的值),非私有的属性和方法可以在子类直接访问,但是私有属性和方法不能直接在子类访问,通过父类提供的公共方法去访问。
2.子类必须调用父类的构造器,完成对父类的初始化。
3.当创建子类对象时,不管使用子类哪个构造器,默认情况下总是会调用父类的无参构造器,如果父类没有提供无参构造器(在父类中如果没有无参构造器代码段,并且声明了其他有参构造器,则默认的无参构造器被隐藏),则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译将不通过。(初始化子类前,总是先初始化父类)
4.如果希望调用父类的哪个构造器,显式的调用一下。
5.super(...)(注意super(...)是构造器,和下面的super.不同)语句必须放在构造器的第一行。
6.JAVA中是单继承。
继承的本质
当执行 Son son = new Son();语句时。会从Objectlei类逐层向下加载,直到加载至Son类。
当要访问son中的属性时,却是从son开始向父类查找。
如果Object 中也没有,就会报错。如果father类中有age属性,但是却用private修饰(子类不能访问父类私有成员),此时会报错。(一层层查找,不会跳跃)。
(儿子先找,儿子没有找父亲,父亲没有找爷爷,直到找到Object)。
SUPER.
当一些属性和方法在子类中被重写,而我们又希望访问父类的这些属性方法。可以使用super.关键字。
super的访问不局限于上一级父类,如果在当前类的上一级父类中没有找到,则会一直向上查找。
方法重写
1.子类的方法的参数,方法名称,要和父类方法的参数,返回方法相同。
2.子类方法的返回类型可以与父类方法返回类型相同,或者是父类返回方法的子类。
3.子类不能缩小父类方法的访问权限
多态
方法或对象具有多种状态,例如方法的重写与重载。但最主要的还是对象的多态。
重要的几句话
1.一个对象具有两种类型,编译类型和运行类型。
2.编译类型是由声明该变量时的类型所决定,运行类型由实际赋给该对象的类型所决定。
3.编译类型在定义对象时就确定了,不能改变。运行类型可以变化。
4.编译类型看=左边,运行类型看=右边
//假设Animal是Dog的父类
Anima animal = new Dog();//此时父类的引用animal指向了一个子类Dog对象,animal的编译类型就是Animal运行类型就是Dog
那么这个 具有两种类型的animal 究竟有什么特性呢?
看老韩的图
会发现animal在调用子类和父类共有的函数cry()时 是按照子类的类型,也就是运行类型调用的。
向上转型
本质:父类的引用指向了子类的对象。
animal不能调用子类中特有的成员。(子类重写的成员依然可以调用)
向上转型的调用规则
1.可以调用父类的所有成员(需要遵守访问权限)
2.不能调用子类的特有成员。
PS:个人的一点见解。
在编译器眼里,animal引用依然是Animal类,在Animal中没有的成员自然不能调用。
但是运行时,在虚拟机眼里,这个animal指向堆中的一个Cat类,调用成员时就遵守上文中的查询机制(儿子先找,儿子没有找父亲,父亲没有找爷爷,直到找到Object)。
向下转型
对象的向下的转型是基于向上转型的。
类似于基本数据类型的强转
注意上图中的animal本来是指向 Cat类型的。也就是向上转型过。
属性重写问题
属性没有重写之说,属性的值看编译类型。