为什么成员内部类里不能定义静态的属性和方法
答案:4 悬赏:0
解决时间 2021-02-15 07:56
- 提问者网友:柠檬香
- 2021-02-14 11:19
为什么成员内部类里不能定义静态的属性和方法
最佳答案
- 二级知识专家网友:浪者不回头
- 2021-02-14 11:34
这个问题这么理解是比较容易的:
其实:随着类文件的加载所有静态成员都会在内存中获得相应的内存空间完成初始化,内部类可以视为外部类的类成员变量,如果这个内部类为非静态的话就是说他不会随着外部类的加载而得到内存分配,也就是说不会随着外部类的加载完成而完成初始化。如果此时内部类内存在静态成员的话,就会引起编译失败,原因很简单,内部类的静态成员此时也要完成初始化即要获得相应的内存空间,而他依托的非静态内部类又没有获得内存的分配,所以他就无法完成初始化。
打个比方:我是村长我来分配土地给大家种地,我们有个规定是先给穷人分配土地让他们种粮食,富人以后再说,那么这个制度一旦通过的话穷人自然就会获得土地种粮食,而富人要种粮食的话就要“”变成穷人“,否则,你打着富人的招牌种粮食是不被制度允许的。这里种粮食可以被理解为内存的初始化,穷人代表静态变量,富人代表非静态变量。
其实:随着类文件的加载所有静态成员都会在内存中获得相应的内存空间完成初始化,内部类可以视为外部类的类成员变量,如果这个内部类为非静态的话就是说他不会随着外部类的加载而得到内存分配,也就是说不会随着外部类的加载完成而完成初始化。如果此时内部类内存在静态成员的话,就会引起编译失败,原因很简单,内部类的静态成员此时也要完成初始化即要获得相应的内存空间,而他依托的非静态内部类又没有获得内存的分配,所以他就无法完成初始化。
打个比方:我是村长我来分配土地给大家种地,我们有个规定是先给穷人分配土地让他们种粮食,富人以后再说,那么这个制度一旦通过的话穷人自然就会获得土地种粮食,而富人要种粮食的话就要“”变成穷人“,否则,你打着富人的招牌种粮食是不被制度允许的。这里种粮食可以被理解为内存的初始化,穷人代表静态变量,富人代表非静态变量。
全部回答
- 1楼网友:猎杀温柔
- 2021-02-14 13:17
静态的对象,在内存中实默认实例化的,在加载的时候就会存放到内存中。
也就是可以直接调用而不需要手动实例化。
理解这个就不难理解楼主说的问题了。
首先内部的静态类他是不能直接被实例化的。你必须实例化外部类才能实例化它。而外部类不是默认加载的,他只有在手动实例化之后才有内存分配。
这时问题出现了。既然静态对象是默认加载,那么静态内部类应该先于外部类被加载到内存中。
那么这是又和我们之前的一个结论相反(首先内部的静态类他是不能直接被实例化的。你必须实例化外部类才能实例化它。)所以这种写法是错误的。
- 2楼网友:时光挺欠揍
- 2021-02-14 13:04
我倒是觉得这不是一个技术上不能的问题,而是一个概念上的问题。技术上讲,虚拟机并不区分内部类和其他普通的类,也就是说它们在加载,验证,解析等等走的都是同一个流程。而之所以虚拟机可以不做区分,因为编译器在编译内部类的时候,其实偷偷做了很多工作,比如要把外围类的实例引用偷偷传到内部类的构造器中,有的时候还得为了让内部类访问外围类的私有变量,还得在外围类中也去构造一些不安全的方法,因为只有这样,才能通过虚拟机最后执行时候,对权限的检查。所以,内部类也可以看成是语法糖,是编译器的概念。
那为什么编译器一定要禁止在内部类中使用静态属性呢?我觉得,主要是想强调一个概念:内部类是跟外围类的实例联系在一起的。
但这绝不是一个技术上不能的问题。
- 3楼网友:颜值超标
- 2021-02-14 12:20
这个问题这么理解是比较容易的:
其实:随着类文件的加载所有静态成员都会在内存中获得相应的内存空间完成初始化,内部类可以视为外部类的类成员变量,如果这个内部类为非静态的话就是说他不会随着外部类的加载而得到内存分配,也就是说不会随着外部类的加载完成而完成初始化。如果此时内部类内存在静态成员的话,就会引起编译失败,原因很简单,内部类的静态成员此时也要完成初始化即要获得相应的内存空间,而他依托的非静态内部类又没有获得内存的分配,所以他就无法完成初始化。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯