【问题标题】:Multilevel Inheritance多级继承
【发布时间】:2018-03-05 04:51:31
【问题描述】:
我想澄清一下 Java 中的多级继承。有人可以解释每个示例输出(例如,在选项 (i) 和 (iv) 之间,对象的类是上面的直接父类还是主父类 A)?
i) A a = new C(); a.P(); will print B.P T/F?
ii) D d = new B(); d.Q(); will cause a compilation error T/F?
iii) B b = new C(); b.M(); will cause a compilation error T/F?
iv) A a = new E(); a.P(); will print A.P T/F?
【问题讨论】:
标签:
java
inheritance
parent-child
【解决方案1】:
I) A a = new C(); a.P(); //will print B.P - 正确
-
C 是 A 的子对象,因此我们可以将 C 对象放入 A 变量中。
-
A 有P() 方法,所以我们可以调用a.P()。
-
C 没有自己的P() 方法,但它是从B 继承的,所以它会打印“B.P”。不是来自A,因为它已被明确覆盖。
II) D d = new B(); d.Q(); //will cause a compilation error - 正确
-
B 不是D 的子对象,所以我们不能将B 对象放到D 变量中。
III) B b = new C(); b.M(); //will cause a compilation error - 错误
-
C 是 B 的子对象,因此我们可以将 C 对象放入 B 变量中。
-
B 没有自己的M() 方法,但它继承自A,所以我们可以调用b.M()。
-
C 已覆盖 M() 方法,因此它将打印“C.M”。
IV) A a = new E(); a.P(); //will print A.P - 正确
-
E 是 A 的子对象,因此我们可以将 E 对象放入 A 变量中。
-
A 有P() 方法,所以我们可以调用a.P()。
-
E 没有自己的P() 方法,就像D 一样,但是它是从A 链式继承的,所以它会打印“A.P”。
【解决方案2】:
您可能对 Java 中的 instanceof 运算符感兴趣:
System.out.println("Im a String" instanceof Object); // prints "True"