Java中的多级继承

Java中的多级继承,java,inheritance,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")

我最近遇到了一个关于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{

    }

所以我的问题是为什么这是打印为“内部B”。因为类C没有重写方法print(),因此它应该基于编译时解析方法,因此应该在“中打印”。如果我遗漏了什么,请告诉我。感谢您的帮助。

它打印“在B内部”,因为B是C扩展的类,因此B是C的超类

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

您混淆了两件事

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


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

c
属于
A
类型,但是
A
本身被初始化为
c
的实例,并且由于
c
扩展了
B
B
覆盖了
A
,因此,
B
C
都覆盖
A
中的方法。但是由于
C
不覆盖
B
,因此使用的方法是B


要说的是,这是一个很好的脑力锻炼。

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

它应该根据编译时解析方法-也就是说,类B重写类a,因此现在将调用类B的方法。类C扩展了B而不是A,它将调用最后一个重写的方法,而不是原始方法。因此类B的print方法被调用。除非C类重写print方法,否则它将默认为最后一个重写的方法,即B类的print方法。为什么您认为
C
应该跳过其直接父级的重写方法,而使用其“祖父母”之一?