Java中Animal b = new Dog();Dog c = new Dog();的區別


由於在編譯階段,只是檢查參數的引用類型。然而在運行時,Java虛擬機(JVM)指定對象的類型並且運行該對象的方法。因此在下面的例子中,b.move()之所以能編譯成功,是因為Animal類中存在move方法,所以編譯成功,然而運行時,運行的是特定對象的方法,即運行的是Dog類的move方法。而對Dog c而言,編譯階段首先是去Dog中查找bark(),因此能編譯成功,同時也能運行成功;但是對於b.bark()而言,首先是去Animal類中尋找bark(),因為找不到,因而編譯錯誤。

public class JavaOverrideOverload {
    public static class Animal {
        public void move() {
            System.out.println("動物可以移動");
        }
    }

    public static class Dog extends Animal {
        public void move() {
            System.out.println("狗可以跑和走");
        }

        public void bark() {
            System.out.println("狗可以吠叫");
        }
    }

    public static void main(String args[]) {
        Animal a = new Animal(); // Animal 對象
        Animal b = new Dog(); // Dog 對象
        Dog c = new Dog();
        a.move();// 執行 Animal 類的方法
        b.move();// 執行 Dog 類的方法
        b.bark();
        c.bark();

    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM