在Java中声明非静态类中的静态变量

时间:2016-12-07 10:48:37

标签: java variables static variable-declaration

我是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类是非静态的,我被允许在其中声明一个静态变量。为什么我的第二个代码示例也不能这样做。

任何帮助将不胜感激。谢谢。 :)

1 个答案:

答案 0 :(得分:5)

尝试使用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); } } ,因为Java不允许您在函数本地内部类中定义非最终静态字段。只允许顶级类和静态嵌套类具有非最终静态字段。

来自JLS section 8.1.3

  

内部类可能不会声明静态成员,除非它们是常量变量(第4.12.4节),否则会发生编译时错误。

使内部类静态并访问它的其他方法

{{1}}