为了账号安全,请及时绑定邮箱和手机立即绑定

Java 中多态性的工作原理

Java 中多态性的工作原理

UYOU 2023-08-04 15:44:24
有人可以解释一下当我们扩展时同名方法是否会被覆盖吗?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


查看完整回答
反对 回复 2023-08-04
  • 1 回答
  • 0 关注
  • 90 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信