2016-01-12 209 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(); 
     } 
    } 
相关问题