2012-06-01 114 views
1

例如:超類型變量是否可以引用子類對象?

public class A { 

public class B extends A { 
} 

public static void main(String[] args) { 
    A a; 
    a = new B(); 
} 

} 

我搜索了一些類似的問題,他們表現出「是的,父型變量可以引用子類對象」。但在eclipse中,上面的代碼會出現如下錯誤:「沒有可以訪問類型A的封閉實例,必須使用包含類型A的實例來限定分配(例如x.new A(),其中x是A的實例)」。

那麼有什麼不對?謝謝!

+0

[爪哇 - 類型的無封閉情況foo是接近]的可能的複製(http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo-is-accessible) – fabian

回答

-2

檢查你的禁忌!它應該是:

class A { 
} 
public class B extends A { 


public static void main(String[] args) { 
    A a; 
    a = new B(); 
} 

} 

而且你有兩個public班在你的代碼!

+0

你已經改變了代碼,使'main()'在'B'中,但問題是關於'A'中的代碼。看到我的答案是正確的解釋。 – Bohemian

+0

@ user1429807:兩個'public'類不能在同一個文件中。如果你想讓它們保持兩種不同的文件,你可以將它們放在兩個不同的文件中**或**使其中的一個成爲'default'。 – WickeD

+0

再次......看到我的答案。我添加的所有內容都是在他的代碼中的關鍵字'靜態'在一個地方,並沒有做出其他更改,瞧,問題解決了。我建議你其實*閱讀*我的答案btw。你最後的評論表明你還沒有這樣做,否則你不會做出你關於兩個公共類的不相關的評論(這個問題中的代碼不**有**) – Bohemian

3

答案是「是」超類可以引用一個子類,但是你問的是錯誤的問題。

你得到這個錯誤,因爲B是一個封閉類的A(這意味着你必須有一個實例A擁有的B一個實例),但你從一個靜態方法引用它(即不是A的實例)。

只需將B更改爲static類即可。

public class A { 

    public static class B extends A { // <-- Added static keyword 
    } 

    public static void main(String[] args) { 
     A a; 
     a = new B(); 
    } 
} 

沒有錯誤。

另一種選擇是把它封閉類和做到這一點:

public class A { 

    public class B extends A { // leave B as an enclosed class 
    } 

    public static void main(String[] args) { 
     A a = new A(); 
     a = a.new B(); // can only create a B in the context of an A 
    } 
} 
+0

我明白了!非常感謝! :) – Echo

+0

@ user1429807請注意您的錯誤的替代解決方案,同樣有效。您可能會發現語法有啓發性。 – Bohemian

+1

只是爲了確認,是不是會導致'NullPointerException'這樣的結果呢?即你不需要'A'的非'null'實例來實例化'B'的實例嗎? – SimonC

相關問題