2016-02-04 93 views
0

我正在學習Java,我對此感到困惑:這段代碼究竟工作得如何?類延伸另一個問題?

class A 
{ 
    int n = 9; 

    void show() 
    { 
     System.out.println(n); 
    } 
} 

class B extends A 
{ 
    void show() 
    { 
     System.out.println(n+" "+super.n+" "+a.n); 
    } 

    int n = 4; 
    static A a = new A(); 

    public static void main(String[] args) 
    { 
     B b = new B(); 
     a.show();//9, expected 
     a = b; 
     /*Line A*/ a.show();//4 9 9 
     /*Line B*/ b.show();//4 9 9 
    } 
} 

在A行中,來自B的函數將被調用,這是預期的。但爲什麼要打印4 9 9?

+0

請參閱[Java關於多態性的教程](https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html)。 – rgettman

回答

2

在線路

a = b; 

靜態變量a設爲B類的實例。這是可能的,因爲B繼承自A

因此,請從B類中調用方法show(),而不是A

欲瞭解更多的信息,搜索material on Polymorphism

2

您將b置於a中,但b始終保留爲背景中的對象B Class

可以print.out它是這樣的:

/*Line B*/ b.show();//4 9 9 
System.out.println(a.getClass()); 

基準是從A類型,但對堆的對象是相同的對象b

1

在A行中,我們實際上調用方法.show()上的class A類型的引用。這裏class Bclass A的一個子類。在Java中,父類引用可以指向一個子類對象。

當JVM看到這個調用時,它實際上檢查引用實際指向的對象。在我們的例子中,它指向一個class B類型的子類對象。在這裏,show方法也在class B中聲明。這意味着,它正在成功覆蓋父方法。當JVM看到它時,它實際上調用了子類方法而不是父類方法。整個過程稱爲polymorphism