中易网

为什么成员内部类里不能定义静态的属性和方法

答案:4  悬赏:0  
解决时间 2021-02-15 07:56
为什么成员内部类里不能定义静态的属性和方法
最佳答案
这个问题这么理解是比较容易的:
其实:随着类文件的加载所有静态成员都会在内存中获得相应的内存空间完成初始化,内部类可以视为外部类的类成员变量,如果这个内部类为非静态的话就是说他不会随着外部类的加载而得到内存分配,也就是说不会随着外部类的加载完成而完成初始化。如果此时内部类内存在静态成员的话,就会引起编译失败,原因很简单,内部类的静态成员此时也要完成初始化即要获得相应的内存空间,而他依托的非静态内部类又没有获得内存的分配,所以他就无法完成初始化。

打个比方:我是村长我来分配土地给大家种地,我们有个规定是先给穷人分配土地让他们种粮食,富人以后再说,那么这个制度一旦通过的话穷人自然就会获得土地种粮食,而富人要种粮食的话就要“”变成穷人“,否则,你打着富人的招牌种粮食是不被制度允许的。这里种粮食可以被理解为内存的初始化,穷人代表静态变量,富人代表非静态变量。
全部回答
静态的对象,在内存中实默认实例化的,在加载的时候就会存放到内存中。 也就是可以直接调用而不需要手动实例化。 理解这个就不难理解楼主说的问题了。 首先内部的静态类他是不能直接被实例化的。你必须实例化外部类才能实例化它。而外部类不是默认加载的,他只有在手动实例化之后才有内存分配。 这时问题出现了。既然静态对象是默认加载,那么静态内部类应该先于外部类被加载到内存中。 那么这是又和我们之前的一个结论相反(首先内部的静态类他是不能直接被实例化的。你必须实例化外部类才能实例化它。)所以这种写法是错误的。
我倒是觉得这不是一个技术上不能的问题,而是一个概念上的问题。技术上讲,虚拟机并不区分内部类和其他普通的类,也就是说它们在加载,验证,解析等等走的都是同一个流程。而之所以虚拟机可以不做区分,因为编译器在编译内部类的时候,其实偷偷做了很多工作,比如要把外围类的实例引用偷偷传到内部类的构造器中,有的时候还得为了让内部类访问外围类的私有变量,还得在外围类中也去构造一些不安全的方法,因为只有这样,才能通过虚拟机最后执行时候,对权限的检查。所以,内部类也可以看成是语法糖,是编译器的概念。 那为什么编译器一定要禁止在内部类中使用静态属性呢?我觉得,主要是想强调一个概念:内部类是跟外围类的实例联系在一起的。 但这绝不是一个技术上不能的问题。
这个问题这么理解是比较容易的: 其实:随着类文件的加载所有静态成员都会在内存中获得相应的内存空间完成初始化,内部类可以视为外部类的类成员变量,如果这个内部类为非静态的话就是说他不会随着外部类的加载而得到内存分配,也就是说不会随着外部类的加载完成而完成初始化。如果此时内部类内存在静态成员的话,就会引起编译失败,原因很简单,内部类的静态成员此时也要完成初始化即要获得相应的内存空间,而他依托的非静态内部类又没有获得内存的分配,所以他就无法完成初始化。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
宗门泰斗虚云老和尚在世时,是否对哪位大师的
江源浴池我想知道这个在什么地方
淘宝货到付款怎么退
文登区国土局葛家分局这个地址在什么地方,我
老舍 趵突泉
联想h505台式机反应慢是怎么回事
想找《等你仰望》广播剧的彩蛋,就是化妆的那
宏记正品原味汤粉王在哪里啊,我有事要去这个
0利率购车真的吗
喜欢上一个人加拿大的男人怎麼办 他快去加拿
京东装机质量好吗?会有二手货吗?
吉祥庄村我想知道这个在什么地方
别人带人闯到我家里闹事 把门用脚踹开 并打了
吉他左手用力按也按不响怎么办?
电脑键盘按删除键就出1K 按G键就出GX 怎么回
推荐资讯
明童馆地址有知道的么?有点事想过去
有什么公交车到天津东站后广场
文案工作要熟悉什么办公软件吖?
如何增强盗取的wifi信号
n卡现在哪个版本的驱动最好
min[12,15]是什么意思?
腾讯云云+校园活动的免费域名,在验证时的网
求问全国税收调查表中企业总产值和企业增加值
vivo手机里的i管家怎么关闭
想买辆现代名图不知这车怎么样
五块石到宽窄巷子怎么去
新瑞丰格琳酒店地下停车库怎么去啊,有知道地
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?