2016-09-28 36 views
-1

Test.javaSuperClass s = new SubClass();?

public class Test { 

    public void go(){  
     System.out.println("Test go"); 
    } 
} 

Test2.java

public class Test2 extends Test { 
public void go(){  
    System.out.println("Test 2 go"); 
} 

public void back(){ 
    System.out.println("Test 2 back"); 
    } 
} 

class Demo{ 

    public static void main(String[] args) { 

    Test t=new Test2(); 
    t.go(); // Output : "Test 2 go" 
    t.back(); //Compile time error. 
} 

} 

我讀計算器這方面的一些問題,但我不明白的SuperClass s=new SubClass();意義。 同樣在輸出中,如果測試對象可以訪問Test2的go()方法,那麼爲什麼它不能訪問back()方法。

+0

參見官方語言教程:https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html –

回答

0

這是一個多態性的例子,意思是我們可以使用超類型的引用來引用子類型對象。

back()方法未定義爲Test類型。你打電話back()方法Test類型變量是無效的。 當聲明

Test t = new Test2(); 
  • 你正在創建類型Test
  • 你是指一個對象,它是使用 多態性引用類型Test2的參考變量t

此外,在如果測試的對象可以訪問的Test2的go()方法,那麼爲什麼就不能訪問後臺()方法的輸出。

作爲tTest類型的,它可以只知道在Test類中定義的方法。它可以不知道這是在子類Test2

關於在評論你的問題中定義的方法,

  • 當你說:t.go(),在編譯器會從 Test類思維go()方法被調用。在編譯時不知道哪個對象將被創建。
  • 你的聲明Test t = new Test2();在運行時創建Test2對象,進而從Test2調用go()方法,因爲它是從Test

覆蓋go()你真的應該瞭解compile time polymorphismruntime polymorphism

+0

如果「它無法知道在Test2子類中定義的方法」,那麼t.go()的輸出必須是「測試去「意味着它守從Test中調用ld call go()方法。爲什麼它調用Test2的go()方法? –

+0

@AshrafMulla prasad給出了它的正當理由來解釋,如果你想要,你可以嘗試閱讀我的答案 –

+1

是的@PavneetSingh由於你的解釋,這個問題出現了。「這是多態語句,其中父參考變量可以容納參考的孩子對象。「和Prasad Khamkar的」它不知道在子類Test2中定義的方法「,現在我理解了多態的過程,非常感謝你們兩個, –

相關問題