在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不允许您在函数本地内部类中定义非最终静态字段。只有顶级类和静态嵌套类才允许有非最终静态字段。

JLS section 8.1.3

内部类可以不声明静态成员,除非它们是常数变量(§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); 
    } 
} 
+0

其他方式将使得查理类的静态。可能值得一提 – Aelop

+0

我明白了。 Java有这个限制的原因吗?这是否意味着Java虚拟机会处理与外部类不同的内部类? – FunnyFunkyBuggy

+0

@Aelop对..我刚刚更新了我的答案。 – iMBMT