非静态内部类不能拥有静态变量 为什么

下面这段代码,如果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就已经不合法了,根本没法往下走。嗯,我觉得我自己的理解比网上查到的靠谱多了

什么是匿名内部类

实际上匿名内部类是对下面这种写法的简化

public class InnerClassLearn {
class MyThread extends Thread {
private int i = 11;
public int value() {return i;}
}
public Thread thread() {return new MyThread();} public static void main(String[] args) {
Thread thread = new InnerClassLearn().thread();
}
}

用匿名内部类的方式重写上面的代码:

public class InnerClassLearn {

    public Thread thread() {
return new Thread() {
private int i = 11;
public int value() {return i;}
};
} public static void main(String[] args) {
Thread thread = new InnerClassLearn().thread();
}
}

其中红色部分就是一个继承于 Thread类的匿名内部类

最新文章

  1. [WPF系列]基础学习(一) WPF是什么?
  2. 数论 - 欧拉函数的运用 --- poj 3090 : Visible Lattice Points
  3. init: Associated with Deployer 'Catalina:type=Deployer,host=localhost'
  4. CSS浏览器兼容性----Hack
  5. 执行Asp.net应用程序在Linux上的3种托管方式
  6. React+ES6+Webpack环境配置
  7. 通过修改CoreCLR中的ClrHost实现自托管程序
  8. Activity的直接子类
  9. SOFA 源码分析 —— 过滤器设计
  10. DirectX11 初探XMVECOTR&XMMATRIX
  11. ionic3 安卓硬件返回
  12. Spark WordCount 文档词频计数
  13. cocos2dx自带物理引擎-创建物理世界
  14. css高级选择器&盒模型
  15. (网页)AngularJS 参考手册
  16. Java发送邮件时标题和发件人乱码
  17. Python基础知识(Basic knowledge)
  18. CodeAction_beta02 斐波那契 (多维DP)
  19. ajax post data 获取不到数据,注意contentType
  20. C#字母转换成数字/数字转换成字母 - ASCII码转换

热门文章

  1. 使用window10系统搭建完善的Linux开发环境
  2. matlab 正弦信号产生
  3. js 一些小技巧
  4. C Make a Square Educational Codeforces Round 42 (Rated for Div. 2) (暴力枚举,字符串匹配)
  5. Spring Boot 整合监听器
  6. MySQL优化建议与使用规范
  7. 2019强网杯web upload分析(pop链)
  8. java数据结构4--集合Set
  9. mysql数据库密码
  10. python2---输出1--100之间的偶数