Java中的多级继承

时间:2015-11-02 19:24:47

标签: java inheritance

我最近遇到过一个关于java中多级继承的问题,问题如下:

 public class Test{

        public static void main(String[] args) {
            A c = new C();
            c.print();
        }

    }
    class A{
        public void print(){
            System.out.println("Inside A");
        }
    }

    class B extends A{
        @Override
        public void print(){
            System.out.println("Inside B");
        }
    }
    class C extends B{

    }

所以我的问题是为什么打印为" Inside B" 。因为C类没有覆盖方法print(),因此它应该根据编译时间解析方法,因此应该打印"在A" 内。如果我遗漏任何东西,请告诉我。谢谢你的帮助。

5 个答案:

答案 0 :(得分:5)

C扩展B,这意味着它将具有与B相同的方法,并且在这种情况下B已经覆盖了该方法,因此C也将拥有它。

答案 1 :(得分:1)

它的印刷"内部B"因为那是C正在扩展的类,而B是C的超类。

答案 2 :(得分:1)

你混淆了两件事。

如果方法被重写一次或多次,则将运行最具体子类中的版本。这就是为什么B中的版本是使用的版本。

另一方面,在重载方法之间进行选择时,决定是基于参数的编译时类型。

答案 3 :(得分:1)

c的类型为A,但A本身已初始化为C的实例,自C扩展BB覆盖A内的BC覆盖方法A。但由于C未覆盖B,因此使用的方法来自B。

不得不说,这是非常整洁的大脑运动。

答案 4 :(得分:1)

根据Java中的继承定律,基类中的所有函数都由派生类使用,包括被重写的类。从中间继承的类继承的任何类都将采用重写的定义。这是不言而喻的,因为这些重写的函数会覆盖继承层次结构中的任何函数定义。因此,重写的函数充当其下任何派生类的基类定义。