如果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);
}
}
提前谢谢。
答案 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)
Animal
是Test
的内部类,这意味着它的任何实例都必须与封闭类型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以便更好地理解。