我是Java的初学者。运行给定的问题时,我正在练习Java嵌套类。Oracle JDK 11.0.5
问题:-
[每当我尝试为以下代码运行编译器时,我都会遇到给定的错误。
public class test {
public class Outer{
static int out1;
public static void display1() {
System.out.println("\n\nIn outer one!");
System.out.println(out1);
}
public static class Inner{
static int ini;
static String ins;
static char inc;
static float inf;
static {
ini = 2;
ins = "Inner";
inc = 'I';
inf = 2.0f;
}
public static void display2() {
System.out.println("In the inner class now!");
System.out.println(ini);
System.out.println(ins);
System.out.println(inc);
System.out.println(inf);
}
}
}
public static void main(String[] args) {
Outer o1 = new Outer();
o1.Inner.display2();
}
}
但是当我在第1行中添加static关键字以使其成为“ public static class Outer”并且没有其他更改时,代码开始正常工作。为什么?是因为静态成员无法访问非静态数据。请尽快提供帮助。
public class test {
public class Outer{
}
public static void main(String[] args) {
Outer o1 = new Outer();
Outer
需要引用test.this
。您需要使用高度模糊的语法为构造函数提供对test
实例的引用,希望您在实际代码中永远不会看到。
对于非静态内部类的静态成员有模糊的限制。这些细节太无聊了,难以记住。就在前几天,mooted对此有所放松,好像Java不允许您在该区域中进行足够愚蠢的事情一样。
o1.Inner.display2();
由于Inner
是静态嵌套类,因此ol
不在此处用作实例。令人惊讶的是,它被用于其静态类型,并且可以由Outer
代替。
我的建议是尽量避免嵌套/内部/局部类,并且绝对要避免任何可变的静态变量(即全局状态)。