继承关系
父与子的关系
首先,允许多层继承但不允许多重继承(一继多)
子类本质上是包含了父类的,下面这张图片从内存的角度解释了这一点
值得一提的是构造它们的时候走构造函数的顺序:
在构造子类对象的时候要先构造出一个父类对象,也就是说,先执行父类的无参构造或者系统帮忙添加的无参构造,再走子类的构造。
假如父类没有无参构造却有有参构造,系统不会帮忙添加了无参版本了,也就会报错,这时候子类可以通过super去显式调用父类有参版本的构造。
使用——多态现象
多态涉及的访问规则看似很复杂,但总结起来就是:一个子类“被当作父类”使用时就只能访问父类有的成员和方法,其中被重写覆盖的方法用覆盖后的版本,注意静态方法不会被覆盖。向下转型之后就是一个普通类。
抽象类和接口的继承
抽象的继承,规则本身没有什么好说的,那就是有一些共性被抽象提炼出来了,作为抽象的方法或者类,一层层继承下来我们可以任意给它具体化。
接口(interface)是一种特殊的抽象类(abstract class),区别在于:接口限定的更死,只有常量和抽象方法;接口跟它的子类是实现(implement)的关系,也是特殊的继承(extends)。
允许:1.接口继承接口的多层继承和继承多个接口的多重继承
2.同时继承类和多个口
嵌套关系
成员内部类
嵌套在类中(方法外),本质是成员(所以可以static),所以它访问外部类成员就像其他普通成员一样平等。外部类访问内部类对象得先创造出它的对象。
方法内部类
嵌套在方法中,只能访问局部的final变量。
原因在于局部变量会随着方法调用完毕而消失,但内部类还在堆中暂时未被回收。加上final以后,内部类中变量的调用就会被替换为常量,否则到了回收内部类的时候就找不到这个变量。