2012-04-24 72 views
12

我有一個非常簡單的類,我想用它作爲另一個子類。但是,當我把它的代碼在父類,我得到:爲什麼我會得到「不能從靜態上下文中引用的非靜態變量」?

非靜態變量這不能從靜態上下文

當我把sublass GenTest的類引用在另一方面「父級」代碼之外的代碼 - JavaApp1我沒有收到此錯誤。

public class JavaApp1 { 

    class GenTest { 
     @Deprecated 
     void oldFunction() { 
      System.out.println("don't use that"); 
     } 
     void newFunction() { 
      System.out.println("That's ok."); 
     } 
    } 

    public static void main(String[] args) { 
     GenTest x = new GenTest(); 
     x.oldFunction(); 
     x.newFunction(); 
    } 
} 

這是怎麼發生的?

+2

值得一提的是,GenTest不是JavaApp1的子類。它是一個嵌套類。不同的是,子類繼承父類的公共和受保護的屬性。 – ccoakley 2012-04-24 16:23:23

+0

只需將GenTest放入其自己的文件中即可。沒有必要將它嵌入到JavaApp1中。 – 2012-04-24 16:23:26

+1

http://stackoverflow.com/questions/5272957/problem-creating-object-of-inner-class-in-java – 2012-04-24 16:27:21

回答

16

你的嵌套類(其不是一個子類,順便)未被標記爲靜態的,因此它是一個類這要求編碼類(JavaApp1)的一個實例,以構建它。

選項:

  • 使嵌套類的靜態
  • 使它不是一個內部類(即不內JavaApp1在所有)
  • 創建的JavaApp1爲「外圍實例」的實例:

    GenTest x = new JavaApp1().new GenTest(); 
    

就個人而言,我會採用第二種方法 - 在Java中嵌套的類有一些古怪的東西,所以我會使用頂級類,除非你有充分的理由使它嵌套。 (最後一個選項特別混亂,IMO。)

有關內部類的更多信息,請參閱section 8.1.3 of the JLS

2

它應該是static class GenTest,因爲您從靜態方法創建它的一個實例。

此外,一般來說,內部類應該是靜態的。

1

GenTest類是一個非靜態類,因此必須在JavaApp1的實例中實例化。如果你做了static class GenTest你有什麼工作,否則你需要創建一個JavaApp1的實例,並在非靜態方法中創建GenTest

1

因爲GenTest是使用JavaApp1的上下文定義的,所以是Thar's。所以你可以參考它,除非你有一個JavaApp1的實例。將其更改爲static class即可運行。

static class GenTest...

1

請使用

static class GenTest()...... 
0

要調用的方法是不要做那種事的正確方法。由於內部類GenTest是的JavaApp1調用正確的方式成員將是

GenTest x = new JavaApp1().new GenTest();

使用它,你的類將正確編譯。

0

該類是嵌套的,這意味着您的嵌套類不是靜態的,這意味着您必須通過主類的對象爲嵌套類創建一個對象。這意味着你的psvm應該是這樣的。

public static void main(String[] args) { 
    JavaApp1 a=new JavaApp1(); //create an object for the main class 
    JavaApp1.GenTest x=a.new GenTest(); 

    x.oldFunction(); 
    x.newFunction(); 
} 
相關問題