有人可以解释一下当我们扩展时同名方法是否会被覆盖吗?A 类 ab = 新 B 类?ab 看到哪些方法?A类:public class ClassA { public static int count = 0; public void print(){ System.out.println("Print A"); } public static void printNumber() { System.out.println("Class A " + (++count)); }}B 类: B 类中哪些方法将被重写?public class ClassB extends ClassA { public static int count=0; public void print() { System.out.println("Class B"); } public static void printNumber() { System.out.println("Class B " + (++count)); }}测试类: 这里会调用哪个方法?public class ClassTest { public static void main(String [] arg) { ClassA a = new ClassA(); ClassB b = new ClassB(); ClassA ab = new ClassB(); a.print(); a.printNumber(); b.print(); b.printNumber(); ab.print(); //Why when we call print() method returns print method of ClassA ab.printNumber() ;// Why when we call printNumber() method return method of ClassB }}
1 回答
杨__羊羊
TA贡献1943条经验 获得超7个赞
调用静态方法取决于声明类型而不是实例化类型。
所以在这一行中:
ClassA ab = new ClassB(); ^ ^ declared type instantiated type
ab 将始终使用其声明类型 ( Class A
) 的静态方法——如果printNumber();
您的 IDE 实际上应该为您提供如下建议:
通过实例引用访问静态成员 ClassA.printNumber()
并且可能会建议将该行调整为:
ClassA.printNumber();
这与调用动态方法(例如print()
)不同,动态方法将始终尝试调用实例化类型的重写方法(在 ab 的情况下,实例化类型是ClassB
)
添加回答
举报
0/150
提交
取消