下面的代码在运行时显然会打印出“ B1 / A2 / B2”。现在,是否可以改为打印“ A1 / A2 / B2”(即A#method2()应该在A而不是B上调用method1())?
注意:我不需要获得传递多态性,这个问题仅出于好奇。
class A { public void method1() { System.out.println("A1"); } public void method2() { method1(); System.out.println("A2"); } } class B extends A { @Override public void method2() { super.method2(); System.out.println("B2"); } @Override public void method1() { System.out.println("B1"); } } public class Tmp { public static void main(String args[]) { B b = new B(); b.method2(); } }
是的,您可以做到。在包 a中 定义A :
package a; public class A { void method1() { System.out.println("A1"); } public void method2() { method1(); System.out.println("A2"); } }
在包 b中 定义B :
package b; import a.A; public class B extends A { @Override public void method2() { super.method2(); System.out.println("B2"); } void method1() { System.out.println("B1"); } }
将测试放入软件包 a中 并运行它。结果是A1 / A2 / B2。当然这是不健康的:请注意在method1上@Override的必要省略- 如果将其放回原位,则会出现编译器错误:
method does not override or implement a method from a supertype