2014-03-12 40 views
1

在下面的代碼中,子類擴展了它的超類,並覆蓋了它的方法,使用它來調用子類中唯一的另一個方法,該方法使用子類的變量。將子類保存爲超類型並在Java中使用其方法

程序然後將子類的實例存儲到類型爲Superclass的變量,然後調用其方法。然後運行,就好像它是Subclass類型一樣,調用子類的唯一方法和變量。但是,直接訪問它們是不可能的。

class Superclass { 
    void go() { 
     System.out.println(0); 
    } 
} 

class Subclass extends Superclass { 
    int i = 1; 

    @Override 
    void go() { 
     run(); 
    } 

    void run() { 
     System.out.println(i); 
    } 
} 

public class JavaApplication { 
    public static void main(String[] args) { 
     Superclass instance = new Subclass(); 

     instance.go();     // outputs 1; it must have called run() and accessed i 
     instance.run();    // causes compile-time error 
     System.out.println(instance.i);// causes compile-time error 
    } 
} 

一旦Subclass實例保存爲類型Superclass,它仍然可以訪問所有Subclass字段和方法。那麼爲什麼我不能直接訪問它們呢?

+0

類型由於引用類型是超類,也沒有保證所引用對象有這種方法。 – Veluria

+1

確實。只因爲你知道他們在那裏,並不意味着電腦可以保證他們會。你想做的事情叫做[downcasting](http://en.wikipedia.org/wiki/Downcasting),一般來說這是一件糟糕的壞事,可能意味着你的設計需要仔細考慮。在某些情況下,它是不可避免的,但這些是少之又少(尤其是適當的泛型) – aruisdante

+0

[可以在超類對象上調用子類的方法嗎?](http://stackoverflow.com/問題/ 898909/is-it-it-it-it-call-subclasses-methods-on-a-superclass-object) –

回答

0

在變量和靜態方法的情況下,調用根據引用類型的方法,而不是根據被引用的對象。

但在實例方法的情況下,該方法被稱爲根據對象的類型被稱爲,不根據參考

+0

除了OP的問題是子類方法甚至不能被引用,因爲引用被聲明爲超類。 –

相關問題