2016-01-12 194 views
1

我已經搜索了這個問題,但仍然沒有得到任何解決方案。靜態上下文中的非靜態變量引用(Java)

我宣佈這個簡單的程序:

public class Test{ 
    public abstract class Person { 
     public void talk(){ 
     System.out.print("I am a person"); 
     } 
     public abstract void display(); 
    } 

    public class Student extends Person { 
    public void talk(){ 
     System.out.println("I am a student"); 
    } 

    public void display(){ 
     System.out.println("Nice to meet you"); 
     super.talk(); 
    } 
    } 

    public static void main(String args[]) 
    { 
    Student s = new Student(); 
    s.display(); 
    } 
} 

,但它不斷給我的錯誤:

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

Student s = new Student(); 

引用我一直以這種方式宣佈對象!我不知道今天發生了什麼。

我需要了解我在這裏做錯了什麼?

+1

除了'main'方法,似乎沒有靜態方法,也沒有'this'關鍵字的用法。你確定你發佈了正確的代碼嗎? – npinti

+0

它抱怨變量'this',你沒有,你也不使用關鍵字this,所以,請確保你的文件已保存,然後再試一次 – Stultuske

+0

是的,我是。我不知道我做錯了什麼。 :S –

回答

7

當你聲明的內部類:

class Outer { 
    class Inner { 
    } 

    void doSomething() {} 
} 

有一個隱含的參考到由的每個實例持有的Outer類的實例。這意味着,你可以寫在內部類下面是指外實例:

Outer.this.doSomething(); 

其實,你可以經常寫簡單doSomething() - 你只需要Outer.this如果內部類也被稱爲doSomething()的方法,你需要消除歧義。

的長期和短期的,這是你真正需要的Outer一個實例來創建的Inner一個實例:如果你實際上並不需要參考的Outer實例內Inner

Outer outer = new Outer(); 
Inner inner = outer.new Inner(); 

例如,你永遠不需要調用doSomething()),最簡單的辦法就是讓內部類static

class Outer { 
    static class Inner {} 

    void doSomething(); 
} 

事實上,我會建議表示你總是讓你內在的類是靜態的,除非你真的需要它們是非靜態的。

+0

完美答案@Andy –

+0

Inner inner = new Outer()。new Inner();清除一切,爲了有一個內部類的實例,你需要外部類的實例 –

1

讓你的人及學生類的靜態

OR

創建測試對象首先要創建主要方法Student對象。

Student s = new Test().new Student();

原因:由於人/班的學生都是非靜態的,他們不能沒有試驗對象存在。所以這些類應該是靜態的,或者應該先創建Test()來創建Student。

+0

我不明白Test object是什麼意思? –

+0

添加了相應的代碼。請檢查。 –

+0

是的,我現在明白了。但分離文件更容易。謝謝 –

1

將人員和學生從測試類:

public abstract class Person { 
    public void talk(){ 
     System.out.print("I am a person"); 
    } 
    public abstract void display(); 
} 

public class Student extends Person { 
    public void talk(){ 
     System.out.println("I am a student"); 
    }  
    public void display(){ 
     System.out.println("Nice to meet you"); 
     super.talk(); 
    } 
} 

public class Test{ 
    public static void main(String args[]) { 
     Student s = new Student();  
     s.display(); 
    } 
} 
1

這工作的所有罰款:

 abstract class Person { 
     public void talk(){ 
      System.out.print("I am a person"); 
     } 
     public abstract void display(); 
    } 

    class Student extends Person { 
     public void talk() { 
      System.out.println("I am a student"); 
     } 

     public void display() { 
      System.out.println("Nice to meet you"); 
      super.talk(); 
     } 
    } 

    public class Test { 


     public static void main(String args[]) { 
      Student s = new Student(); 
      s.display(); 
     } 
    } 
相關問題