java非静态实名内部类中的static final问题

     简单来说,一、static final修饰的只能是在常量池有字面量的数据类型,二、不能是引用类型,从设计者角度来说,为什么当初一可以通过,二不行?


     一可行,最主要是为了提高程序的执行速度,因为static final在方法区中具有唯一性,只需要加载一次,在new对象时不需要分配堆内存,假设我们把static去掉,则每次new都需要分配堆内存,而final修饰在常量池中有字面量的数据类型是只读的,访问该量只是为了获得其中的值,我们无法改变其中的值,那这样只要有一个不就行了吗? 这点在非静态实名内部类中也说得通,所以一可行。                                                  

                                                              

     接着来看看二,先来说说为什么不可以具有static修饰的成员域,设计static目的:可以不通过实例化对象就进行访问。由于非静态实名内部类必须要通过一个实例化的外部类访问,与设计static的目的矛盾。接下来看看为什么不可以用static final修饰引用类型,当我们不希望指针改变时,我们才会使用static final,因此,使用static final的目的除了上述原因外,外加上一个不希望指针改变,由于我们还是要实例化外部类对象进行访问内部类,还是与设计初衷矛盾。



     简单总结就是:当初设计static final修饰在常量池中具有字面量的数据类型是为了优化程序,用static final修饰引用类型的目的 1、不希望指针改变,2、希望可以不通过实例对象访问(也是设计static的目的),而非静态实名内部类必须通过实例对象才能访问,与2矛盾。不能有static原因也是因为同2矛盾。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值