重磅!关于为什么成员(内部)类不能拥有静态字段,方法的问题。

搜索了很多资料,最后从stackOverflow看到了比较靠谱的解释:

"suppose there are two instances of outer class & they both have instantiated inner class.Now if inner class has one static member then it will keep only one copy of that member in heap area.In this case both objects of outer class will refer to this single copy & they can alter it together.This can cause "Dirty read" situation hence to prevent this Java has applied this restriction.Another strong point to support this argument is that java allows final static members here, those whose values can't be changed from either of outer class object. Please do let me if i am wrong."

其实就是多重链(映射)的问题。试想外部类Outer,含有成员内部类Inner。三个Inner实例绑一个Outer实例。试想成员类分别有自己的静态域,那么就应该共享,那应该只有唯一的一份属于Inner吧,同时Outer也只对应着这唯一的一份静态域。现在问题来了,我可以递归吧,现在有两个Outer他们成了内部类,最外层为OuterO,那最外层应该只对应一份静态,而这里的每个Outer都有一份静态,那么OuterO就有两份了,这与Outer只有一份矛盾了!所以,这是不允许的。

是这样的:


其实都知道内部类靠语法糖,静态方法static access$000(Object)诸如之类的(Object对应外围类或内部类存在于内外,看要访问哪个域),那个实现上完全不成问题,反正靠参数对象传进来,不靠this,依靠的是静态方法访问字段,那我访问静态字段直接在本类里面 类名.静态字段 做一个返回就行了嘛。还有那些说加载顺序的,因为外部类需要对象。访问静态域要什么对象,不要!外部类做一个类加载就行了嘛,java不是即访问即加载类嘛,没有什么说一开始加载 完了的,完全可以运行时加载,所以,类名访问到了直接回溯加载就行(更不要说继承还要加载父类那么多复杂的关系了,在这里加载外围类完全不是问题)。所以,最终阻碍这个的不是实现问题,而是逻辑问题(异或语义,歧义问题),它确实存在,改变不了。类似于一种菱形映射,终点只有一个,起点一个,那中间层是等价的,中间层又想惟一一个,矛盾了,所以。又想到了菱形继承问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值