51,408
社区成员
发帖
与我相关
我的任务
分享想咨询一下在非静态类的子类中是不能存在静态域吗,如下图所示,会报错,但如果把类 class Employee 改为 static class Employee 就又正常了,谢谢各位

博主你都11年的码龄了,这个不知道?
----------------------------------------
术业有专攻, 楼主英爱是刚新学的JAVA
去查下类加载机制,内部类和public类区别
博主你都11年的码龄了,这个不知道?
首先,“在非静态类的子类中是不能存在静态域吗”这句话本身就有问题,无论静态类还是非静态类都可以拥有静态变量,但是图中博主给的截图中明显是一非静态类的内部类存在静态变量编译报错问题,对于非静态类的内部类为静态类我们可以看作是非静态类的静态变量,在java中,静态域定义为static,每个类只对应一个这样的域,也就是说对于每个类的实例将共享这个静态域。java中的静态域在类加载的时候初始化。java类加载时,先执行加载外部类,再加载内部类,最后初始化内部类中的变量。java中要加载内部类必须在实例化外部类之后完成,而这个时候如果内部类中的变量是静态的就会在类加载时被提前初始化。 也就是说,在外部类还没有实例化,内部类还没有被加载的时候,内部类的属性就已经起作用了,这样明显是有矛盾的,所以java不允许这样做。而java常量放在内存中常量池,它的机制与变量是不同的,编译时,加载常量是不需要加载类的,所以就没有上面那种矛盾。因此你可以在内部类的静态变量后面加个final就行了而不需要在内部类前面加static。
staice final int b = 4; //常量不需要加载类的