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

4

我刚开始学习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个回答

5
尝试使用public static final int number = 0;,因为Java不允许在函数局部内部类中定义非final的静态字段。只有顶层类和静态嵌套类才允许具有非final的静态字段。
来自JLS第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);
    }
}

另一种方法是将Charlie类设置为静态。可能值得一提。 - Aelop
我看到了。Java 有这个限制的原因吗?这是否意味着 Java 虚拟机对内部类和外部类处理不同? - FunnyFunkyBuggy
1
@FunnyFunkyBuggy 因为内部类是类的实例。在实例本身中具有静态变量没有任何意义。 - bNd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接