Java 中多态性的工作原理

有人可以解释一下当我们扩展时同名方法是否会被覆盖吗?


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

    }

}


UYOU
浏览 91回答 1
1回答

杨__羊羊

调用静态方法取决于声明类型而不是实例化类型。所以在这一行中:ClassA ab = new ClassB();   ^           ^ declared type   instantiated typeab 将始终使用其声明类型 ( Class A) 的静态方法——如果printNumber();您的 IDE 实际上应该为您提供如下建议:通过实例引用访问静态成员 ClassA.printNumber()并且可能会建议将该行调整为:ClassA.printNumber();这与调用动态方法(例如print())不同,动态方法将始终尝试调用实例化类型的重写方法(在 ab 的情况下,实例化类型是ClassB)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java