2012-08-02 69 views
2

我試圖找出爲什麼下面的代碼給出錯誤,請任何人都可以解釋。 這裏是一類爲什麼我不能在擴展類中創建一個與內部類名稱相同的對象

package abc; 

public class A { 
    public class B { 

    } 
} 

現在,我嘗試創建一個B級

package xyz; 
import abc.*; 


public class B extends A{ 
    public static void main(String[] args) { 
     B b = new B(); // this line gives error. Can you please explain 
    } 
} 

請考慮B類延伸的是默認包是指

import abc.*; 


public class B extends A{ 
    public static void main(String[] args) { 
     B b = new B(); // this line gives error. Can you please explain 
          // I am try to create "B" class object which extends A 
         //.. not the B inner class 
    } 
} 

錯誤顯示日食是:「不能包含類型A的封閉實例,必須使用包含類型A的實例來限定分配(egxnew A(),其中x是A的一個實例)」。

+1

請發表您的錯誤。 – Baz 2012-08-02 13:41:01

+0

錯誤究竟是什麼?這裏的類型沒有問題,你可能試圖調用一個不存在的構造函數。 – 2012-08-02 13:41:32

+0

如果你發佈錯誤,它會像「封裝類實例所需」。請參閱我的解答。 – tucuxi 2012-08-02 13:46:50

回答

2

鑑於B延伸AA包含內部類B,我懷疑有混亂的空間(編譯器和程序員)。

線:

B b = new B(); 

是不明確的。 其中 B是這個嗎?正如其他地方指出的那樣,內部類B需要一個包含A的實例,所以我懷疑你的意思是B外部類。

編輯:你的錯誤

「A型無封閉情況下進行訪問必須符合A型的egxnew A()的類實例(其中 x是一個實例 分配。的A)「。

證實了這一點。我認爲你想要xyz.B,並應適當的範圍。

+1

Doesn'沒有意義,因爲內部類必須由父級引用。 'A.B' – Woot4Moo 2012-08-02 13:43:36

+0

鑑於我們不知道他有什麼錯誤,他可能觸發了這個確切的問題 – 2012-08-02 13:44:56

+0

@ Woot4Moo即使從同一個文件? – kgautron 2012-08-02 13:45:00

1

嘗試指定的封閉範圍:

B b = new A.B(); 

B b = new xyz.B(); 
1

如果您public class Bstatic,它會工作作爲寫。因爲非靜態內部類需要一個指向其外部類的「this」的指針(在B內,你可以寫this.A,而且這將會在類的實例之外)實際上是指封閉的A)。

0

當我在Eclipse中創建如下:

package com.example; 

public class A { 
    class B { 
    } 
} 

package com.example; 

import com.example.A.B; 

public class B extends A { 

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

正如你所看到的Eclipse導入類A.B。如果沒有導入,請注意以下錯誤:

沒有可以訪問類型A的封閉實例。必須使用一個封閉的A型實例來限定分配(例如x.new A(),其中x是A的一個實例)。

0

當我嘗試編譯此代碼(減去軟件包規格,因爲它們看起來不相關)時得到的錯誤是「非靜態變量,無法從靜態上下文中引用」。所以,問題是,在靜態方法main()你試圖訪問一些非靜態的,我猜是內部類B的定義。

如果第二個外部類有一個實際上,你實際上會得到相同的錯誤不同的名字。所以明顯的命名衝突是一個紅色的鯡魚。儘管這本身不是兩個類都使用相同名稱的好理由 - 但在嘗試理解錯誤時會引起混淆。

如果我將內部類的聲明更改爲靜態,則會解決錯誤。

public class A { 
    public static class B { 

    } 
} 

的靜態還是非靜態內部類相關的一些討論here

但這可能不是正確的修復方法。它顯示main()中的代碼引用了B內部類,而不是包含該方法的B類。你究竟想要什麼?顯然,我建議爲這兩個類使用不同的名稱以避免混淆。如果你想在main()中創建一個包含該方法的類的實例,那麼使用該類的唯一名稱將解決您的問題。

0

你的類B extends A繼承了類A.B和表達new B()指內部類。因此它要求一個封閉的實例。您必須明確限定您提及的B與包名稱,或者更好的是,首先避免這樣的命名混亂

0

我發現這個解決方案,通過反射你可以創建B類(B擴展A類)對象。

import java.lang.reflect.Method; 

import abc.*; 

public class B extends A{ 
    public static void main(String[] args) { 
     //B b = new B(); // this line gives error. Can you please explain 
          // I am try to create "B" class object which extends A 
         //.. not the B inner class 
    try{ 
     Class c = Class.forName("B"); //class B extends A 
     Method m=c.getMethod("print", null); 
     m.invoke(c.newInstance(), null); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    } 

    public void print(){ 
    System.out.println("Printed"); 
    } 
} 
相關問題