本篇紧接上一篇内容继续,还是从继承里的细节开始
目录
1.代码块初始化
2.protected关键字
3.final关键字
4.Java中允许的继承方式
1.代码块初始化
关于代码块的定义和使用因为之前已经进行过介绍,所以这里就不再赘述,我们所关注的点是父类和子类中的代码块在运行时候的先后顺序是怎样的
首先还是在父类以及子类中添加代码块,如下:
//父类
{
System.out.println("父类实例代码块");
}
static {
System.out.println("父类静态代码块");
}
public Plant() {
System.out.println("父类构造方法");
}
//子类
{
System.out.println("子类实例代码块");
}
static {
System.out.println("子类静态代码块");
}
public Tree() {
System.out.println("子类构造方法");
}
我们在main方法中实例化子类对象后来看一下结果:
静态代码块依旧是最先被执行的,然后是父类的实例代码块和构造方法,最后是子类的实例代码块和构造方法
静态代码块由于只执行一次,所以如果再实例化一次子类对象的话父类和子类的静态代码块都不会再执行
2.protected关键字
之前的访问修饰限定符中还遗留了一个protected,这里把这个坑填上,procted在包访问权限的基础上多了一个权限:不同包中的子类可以访问父类的成员
假设Plant和Tree分别在两个包中,那么Plant中protected修饰的成员依旧可以在Tree中使用super来进行访问
需要注意的一点:父类必须是用public修饰,否则访问权限不够,不同包的两个类根本无法构成继承关系
4个访问修饰限定符都讲完了,这里作一个总结:
访问范围 | private | default | protected | public | 同一包中的同一类 | √ | √ | √ | √ | 同一包中的不同类 | × | √ | √ | √ | 不同包中的子类 | × | × | √ | √ | 不同包中的非子类 | × | × | × | √ |
3.final关键字
final关键字同样是用来修饰类、方法以及变量的,作用如下:
修饰变量:成为常量,无法被修改
修饰方法:不能被重写
修饰类:不能作为父类被其它类继承
4.Java中允许的继承方式
单继承:A继承B
多层继承:A继承B,B继承C、C继承D......
不同类继承同一个父类:A继承B,C也继承B
但是Java中不允许一个类继承多个父类(即C++中的多继承)
Java继承的内容结束,后面就是多态的内容,完
|