在Java中的非静态类中声明静态变量
问题描述:
我是java的新手。我正在阅读一些关于静态变量的文章。当我试图实现我的学习时,我遇到了一个关于静态变量的问题。这是第一个代码示例。在Java中的非静态类中声明静态变量
public class Human {
// in Human.java
public static int population = 0;
public static void main(String[] argv) {
System.out.println(population);
}
}
此代码工作正常,结果为0。 但对于下面的代码,我是不允许编译。
public class Human {
// in Human.java
public class Charlie extends Human {
public static int number = 0;
}
public static void main(String[] argv) {
System.out.println(new Human().new Charlie().number);
}
}
中出现错误:场数不能声明在非静态内部类的静态的,除非有一个常量表达式
我很困惑这种情况初始化。对于第一个代码示例,我的Human类是非静态的,我可以在其中声明一个静态变量。我为什么不能为我的第二个代码示例做同样的事情。
任何帮助,将不胜感激。谢谢。 :)
答
尝试使用public static final int number = 0;
,因为Java不允许您在函数本地内部类中定义非最终静态字段。只有顶级类和静态嵌套类才允许有非最终静态字段。
内部类可以不声明静态成员,除非它们是常数变量(§4.12.4),或编译时会出现误差。
其他方法,使内部类的静态和访问它
public class Human {
// in Human.java
public static class Charlie extends Human {
public static int number = 0;
}
public static void main(String[] argv) {
System.out.println(new Human.Charlie().number);
}
}
其他方式将使得查理类的静态。可能值得一提 – Aelop
我明白了。 Java有这个限制的原因吗?这是否意味着Java虚拟机会处理与外部类不同的内部类? – FunnyFunkyBuggy
@Aelop对..我刚刚更新了我的答案。 – iMBMT