在Java中嵌套类并在静态main中引用它们

时间:2015-05-29 07:45:06

标签: java static nested

如果Animal类嵌套在Test中,我会收到错误:

  

"非静态变量不能从静态上下文中引用"

您能解释一下这个错误并提供一种方法来使这段代码工作,同时仍保留嵌套类吗?我想学习使用嵌套类并更好地理解它们。

在线上创建a1时会发生错误:Animal a1 = new Animal();

PS:当Animal是一个独立的类(不是嵌套的),在Test类之外,代码可以工作,但我对嵌套类很感兴趣。

public class Test { 
    class Animal {
        String colour;

        void setColour(String x) {
            colour = x;
        }
        String getColour() {
            return colour;
        }
    }
    public static void main(String[] args) {          
        Animal a1 = new Animal();
        Animal a2 = a1;
        a1.setColour("blue");
        a2.setColour("green");
        System.out.println(a1.colour);
        System.out.println(a2.colour);
    }
}

提前谢谢。

4 个答案:

答案 0 :(得分:3)

要使其适用于嵌套类,请将Animal声明为static类:

public class Test { 
    static class Animal {
        String colour;

        void setColour(String x) {
            colour = x;
        }
        String getColour() {
            return colour;
        }
    }
    public static void main(String[] args) {          
        Animal a1 = new Animal();
        Animal a2 = a1;
        a1.setColour("blue");
        a2.setColour("green");
        System.out.println(a1.colour);
        System.out.println(a2.colour);
    }
}

要理解为什么以前不起作用,请阅读Nested Classes documentation。关键可能是:

  

InnerClass的实例只能存在于OuterClass的实例中,并且可以直接访问其封闭实例的方法和字段。

答案 1 :(得分:3)

AnimalTest的内部类,这意味着它的任何实例都必须与封闭类型Test的实例相关联。

如果您希望将Animal用作常规类并使用new Animal()进行实例化而不需要Test的实例,请将其更改为static,您的主要方法将工作

答案 2 :(得分:2)

正如其他人所说,您可以使用静态嵌套类从静态上下文引用,或者通过Test实例实例化Animal,如下所示:

new Test().new Animal();

答案 3 :(得分:2)

您可以使Animal类保持静态并使代码有效。

否则,如果你不使内部类(动物)静止。内部类(Animal)的对象只能与外部类(Test)的实例一起存在。因此,如果您不想将其设置为静态,则必须先创建一个Test实例才能创建Animal实例。

e.g。

Animal a1 = new Test().new Animal();

请参阅https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html以便更好地理解。