博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
非静态内部类不能拥有静态变量 为什么
阅读量:5235 次
发布时间:2019-06-14

本文共 877 字,大约阅读时间需要 2 分钟。

下面这段代码,如果Lazyholder没有static修饰,则编译不过

class Singleton2 {    private static class LazyHolder {        private static Singleton2 singleton;    }    public Singleton2 getInstance() {        return LazyHolder.singleton;    }}

"非静态内部类不能拥有静态变量" ,可以这样理解,因为JVM类加载的顺序为:

 

java根据需要在运行时把字节码载入到内存,它分三个步骤:

1、加载:类加载器查找到字节码(.class文件)并根据这些字节码创建一个Class对象;

2、链接:验证类中的字节码,为静态域分配存储空间,需要的话同时解析这个类其它类的所有引用;

3、初始化:当类的静态方法(构造器是特殊的静态方法)或者非常数静态域(即不是编译器常量)被首次引用时,执行静态初始化块和初始化静态数据。

然后才能执行对象创建

 

如果LazyHolder没有static,则本质上,它其实是Singleton2的非静态成员,则他必须在Singleton2对象创建之后才会进行加载,然而问题在于,另一方面根据JVM的加载顺序,static 的singleton变量又必须在LazyHolder对象存在之前完成加载,这就矛盾了。

 

靠,上面的是昨天写的,今天突然看不懂了。我想了想,更简单的理解是:

      静态变量是要能够直接用类名.静态变量的方式来访问的,在上面这个例子中,实际上就是Singleton2.LazyHolder.singleton,是这样去访问,但是如果LazyHolder不是静态类,那问题就来了,你会发现singleton无法被访问了!因为Singleton.LazyHolder就已经不合法了,根本没法往下走。嗯,我觉得我自己的理解比网上查到的靠谱多了

转载于:https://www.cnblogs.com/heben/p/5750079.html

你可能感兴趣的文章
svn客户端清空账号信息的两种方法
查看>>
springboot添加servlet的两种方法
查看>>
java的Array和List相互转换
查看>>
layui父页面执行子页面方法
查看>>
如何破解域管理员密码
查看>>
Windows Server 2008 R2忘记管理员密码后的解决方法
查看>>
IE11兼容IE8的设置
查看>>
windows server 2008 R2 怎么集成USB3.0驱动
查看>>
Foxmail:导入联系人
查看>>
vue:axios二次封装,接口统一存放
查看>>
vue中router与route的区别
查看>>
js 时间对象方法
查看>>
网络请求返回HTTP状态码(404,400,500)
查看>>
Spring的JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate
查看>>
Mac下使用crontab来实现定时任务
查看>>
303. Range Sum Query - Immutable
查看>>
图片加载失败显示默认图片占位符
查看>>
【★】浅谈计算机与随机数
查看>>
解决 sublime text3 运行python文件无法input的问题
查看>>
javascript面相对象编程,封装与继承
查看>>