静态域报错的问题

lyw2073327 2021-06-22 18:16:57

想咨询一下在非静态类的子类中是不能存在静态域吗,如下图所示,会报错,但如果把类 class Employee 改为 static class Employee 就又正常了,谢谢各位

 

...全文
621 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
=PNZ=BeijingL 2021-06-24
  • 打赏
  • 举报
回复

博主你都11年的码龄了,这个不知道?

----------------------------------------

术业有专攻, 楼主英爱是刚新学的JAVA

老王就是我 2021-06-23
  • 打赏
  • 举报
回复

去查下类加载机制,内部类和public类区别

星河 2021-06-22
  • 打赏
  • 举报
回复

博主你都11年的码龄了,这个不知道?

星河 2021-06-22
  • 打赏
  • 举报
回复 2

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

staice final int b = 4; //常量不需要加载类的

 

lyw2073327 2021-06-24
  • 举报
回复
@星河 写得很详细了,非常感谢,我刚开始看java,码龄这个可能是注册的时候时间没留意吧

51,408

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧