class Dad {
    private static final String me = "dad";
    protected  String getMe() {
        return me;
    }
    protected  void printMe() {
        System.out.println(getMe());
    }
}

class Son extends Dad {
    private static final String me = "son";
    protected  void printMe() {
       System.out.println(getMe());
    }
}

class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.printMe();
    }
}


在这种情况下,“ Son”类型的引用“ son”并且由于方法printMe()是非静态的,因此将执行来自类Son的方法的代码。
但是,由于Son类尚未重新定义方法getMe(),因此将执行祖先类中的方法代码。
所以我们得到“爸爸”。

第二种情况:

class Dad {
    private static final String me = "dad";
    protected  String getMe() {
        return me;
    }
    protected  void printMe() {
        System.out.println(getMe());
    }
}

class Son extends Dad {
    private static final String me = "son";
    protected  String getMe() {
        return me;
   }


class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.printMe();
    }
}


在这种情况下,Son类没有以类似的方式进行推理,因此未执行方法重新定义printMe(),因此应执行类Dad中方法printMe()的代码。
但是我们得到“儿子”。为什么?

然后继承呢?也就是说,如果继承人没有覆盖祖先的方法,那么他们一起共享祖先的方法的代码吗?

最佳答案

在第一种情况下,son.printMe()调用SonprintMe()(因为Son覆盖该方法),后者调用DadgetMe()(因为Son没有覆盖该方法),这返回“爸爸”。

在第二种情况下,son.printMe()调用DadprintMe()(因为Son没有覆盖该方法),由于Son覆盖了该方法,因此调用getMe()Son。因此,“儿子”被打印。

09-10 08:36
查看更多