Java中多层继承中的方法重写

来源:互联网 发布:steam一直无法连接网络 编辑:程序博客网 时间:2024/05/16 08:27

今天突然看到了一个两层继承的类,他重写了父类的一个方法,而父类的中的方法又是从爷爷类中重写下来的,顿时蒙圈了。于是自己写了个最简单的例子试验了一下,做个记录。
原理很简单ClassA中有一个方法onCreate(),ClassB继承ClassA,ClassC继承ClassB,并且都重写了这个方法,执行ClassC中的onCreate(),看看输出什么就是了。

public class ClassA {    protected void onCreate(){        System.out.println("It's ClassA's sysout");    }}
public class ClassB extends ClassA {    @Override    protected void onCreate() {        System.out.println("It's ClassB's sysout");        //super.onCreate();    }}
public class ClassC extends ClassB {    @Override    protected void onCreate() {        System.out.println("It's ClassC's sysout");        super.onCreate();    }}

之后增加一个Main类

public class Main {    public static void main(String[] args) {        ClassC c = new ClassC();        c.onCreate();    }}

第一遍执行的时候注释了ClassB中的super.OnCreate();执行结果为:

It's ClassC's sysoutIt's ClassB's sysout

可以看到只执行了 直接父类 ClassB中的onCreate()方法,并没有执行ClassA中的方法。
第二遍执行的时候放开ClassB中的注释,执行结果为:

It's ClassC's sysoutIt's ClassB's sysoutIt's ClassA's sysout

执行了ClassA中的OnCreate();
另外之前有个概念一直不清晰,子类重写父类方法时,访问级别可以扩大但不能缩小。比如父类是protected,子类可以写成public。
访问级别:

修饰符 本类 同一个包 子类 其他包 public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × ×

方法修饰符为默认(friendly)时,同一个包下的子类可以重写父类方法,其他包下的子类不能重写父类方法。

原创粉丝点击