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

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

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

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

1.先加载类

2.执行static变量的初始化

3.对象创建

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

时间: 2024-10-11 01:40:09

非静态内部类不能拥有静态变量 为什么的相关文章

静态非静态内部类匿名内部类局部内部类

内部类有静态内部类,静态内部类,匿名内部类,局部内部类 (1)非静态内部类 直接在类的内部定义的类就是非静态内部类,如下 public class Test { public static void main(String[] args) { Outer.Inner c1=new Outer().new Inner(); c1.Print(); } } class Outer{ private int temp=10; class Inner{ private int temp=100; pub

黑马程序员——————>非静态内部类

------- android培训.java培训.期待与您交流! ---------- 大部分时候,类被定义成一个独立的程序单元.在某些情况下,也会把一个类放在另一个人类的内部定义,这个定义在其他类内部的类就被称为内部类,包含内部类的类也被称为外部类,内部类主要有如下作用: 1:内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类. 2:内部类成员可以直接访问外部类的私有数据,因为内部类被当成其成员,同一个类的成员之间可以互相访问.但外部类不能访问内部类的实现细

静态内部类与非静态内部类之间的访问

package cn.hncu.day3.inner; public class Outer { private int size; public void aa(){ size++; System.out.println(size); } public void bb(){ //共用this对象,不需要另外再new一个Outer对象去调用aa() aa(); //相当于this.aa(); } //非静态的内部类1---演示一个非静态内部类的基本用法 //可理解为外部类的一个成员,跟一个方法一

关于静态变量和静态方法的测试

package cs.cwnu; public class StaticTest { int a = 1;//非静态变量 static int b = 2;//静态变量 void sayA() {//非静态方法 this.a=2; System.out.println(a); this.b = 3; System.out.println(b); sayB(); sayC(); } static void sayB(){//静态方法 //a=2; b=3; System.out.println(b

Java非静态内部类中为什么不能有静态变量却可以有常量?

如:public class InnerClassDemo{ int x; class A{ static int a = 0;//这样写是不合法的. static final int b=0;//这样写是合法的    }}解答:简单说,定义一个静态的域或者方法,要求在静态环境或者顶层环境,这里静态环境具体说,你的例子里如果加上 static class A就ok.非静态内部类 依赖于一个外部类对象,而静态域/方法是不依赖与对象——仅与类相关,因此,非静态内部类中不能定义静态域/方法,编译过不了

ERROR无法从静态上下文中引用非静态变量

ERROR无法从静态上下文中引用非静态变量 2012-06-16 20:58:52 分类: Java 什么是“static”? 学习过java.C++或C的人都应该认识这个关键字.用这个关键字修饰的变量叫做静态变量,有其特殊的作用.在java中static也用来修饰静态方法和静态内部类. 静态变量的特点: (1)生存周期:静态局部变量的生存周期也是整个源程序.当定义整个变量的函数结束时,整个变量并没有消失,他始终是存在的. (2)作用域:作用域与自动变量是一样的,只能在定义其的子函数中使用,当退

Java的外部类和内部类+静态变量和非静态变量的组合关系

看的李刚<疯狂java讲义>,里面讲内部类的地方感觉有点散而且不全,看完之后还是不十分清楚到底怎么用,于是自己写了个程序测试了一下.看如下代码,即可知道外部类和内部类+静态成员和非静态成员之间的相互调用规则. 运行结果如下: 总结如下: 注意: 当如下出现报错:“无法从静态上下文中引用非静态时”,问题在于非静态方法或者非静态变量所属的类可能没有被实列化.因为要使用非静态方法,必须实例化它所属的类. 例如:将第40行代码改成inter2.StaticInter(); 编译: 原因是StaticI

静态变量,静态方法,静态代码块,静态内部类

静态变量 有时候当我们希望某个数据在内存之中只有一份,而且能被一个类的所有实例对象所共享的时候.我们可以用static来修饰成员变量,该变量叫静态变量.  例 static String schoolName; 静态变量不会被回收 该变量可以用 类名.变量名调用,也可以通过实例对象调用   static 关键字只能修饰成员变量不能修饰局部变量 静态方法 当我们希望方法不必和对象绑定到一起的时候,我们可以用static来修饰其方法.称其为静态方法. 可以通过 类名.方法名(),也可以通过实例化对象

非静态内部类创建静态实例造成的内存泄漏

请大家思考,为什么会内存泄漏? 1. 首先,非静态内部类默认会持有外部类的引用. 2. 然后又使用了该非静态内部类创建了一个静态的实例. 3. 该静态实例的生命周期和应用的一样长,这就导致了该静态实例一直会持有该Activity的引用,导致Activity的内存资源不能正常回收. 正确的做法有两种,一种是将内部类testResource改成静态内部类,还有就是将testResource抽取出来,封装成一个单例,如上一个例子那样,但是需要context时单例要切记注意Context的泄漏,使用ap