JAVA非静态成员变量之死循环

1.非静态成员变量

当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环

例子:

public class ConstructorCls {

    private   ConstructorCls obj=new ConstructorCls();

}
public class TestC {

    public static void main(String[] args) {
        ConstructorCls c =new ConstructorCls();
    }
}

结果:

Exception in thread "main" java.lang.StackOverflowError
at com.ConstructorCls.<init>(ConstructorCls.java:7)
at com.ConstructorCls.<init>(ConstructorCls.java:7)
at com.ConstructorCls.<init>(ConstructorCls.java:7)

分析:当new ConstrutorCls()  会对ConstrutorCls进行实例 化,后然对这个类的成员obj进行初始化,obj又是对自已所在类进行实列化,这一样一直下去,直到StackOverflowError

2.静态成员变量

静态成员变量是属于类的,不会出现死循环

例如:

public class ConstructorCls {
    private  static ConstructorCls obj=new ConstructorCls();
}
public class TestC {

    public static void main(String[] args) {
        ConstructorCls c =new ConstructorCls();
    }
}

分析:当new  ConstructorCls()时,首先将ConstructorCls加截到JVM中,在加载时对该类的静态成员进行初始化(仅加载时初始化一次),初始化obj对像,new 一个ConstructorCls,  这里的一个关键点  是这个静态成员是属于类的,并不属于某一个实例对像,所以不会产生死循环。

时间: 2024-10-23 07:06:30

JAVA非静态成员变量之死循环的相关文章

分析java类的静态成员变量初始化先于非静态成员变量

分析java类的静态成员变量初始化先于非静态成员变量 依上图中当class字节码文件被jvm虚拟机加载到内存中依次经过 连接 验证:对字节码进行验证 准备:给静态变量分配内存并赋予变量类型各自的默认值(注:基本类型为0或false,对象为null,static final修饰的常量直接赋予相应的值) 解析:类中符号引用转换成直接引用 初始化:为类的静态变量/静态语句块初始化相应的值 而类的初始化契机是:类在被第一次主动使用的情况下,主动使用包括以下6中情况: 使用new关键字实例化对象时. 调用

java:静态成员变量

静态成员变量 可以使用类名调用,如 class Dog { static int age; } class Test2{ public static void main(String args[]){ Dog.age=10; //类名调用 } } 也可以用调用普通成员变量的方法调用,普通成员变量和静态成员变量的区别在于,静态成员变量被所有对象共用. class Test2{ public static void main(String args[]){ Dog d1=new Dog(); Dog

C++静态成员函数不能调用非静态成员变量

其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话 因为无论是静态成员函数还是静态成员变量,它们都是在类的范畴之类的,及在 类的整个生存周期里始终只能存在一份.然而非静态成员变量和非静态成员函数 是针对类的对象而言. 然而从本质上来说类的静态成员函数的函数形参中没有默认的this指针,导致不能 调用具体实例对象的成员. 下面我们来测试一下: 先在静态成员函数中调用静态成员变量: 1 #include <iostream> 2 using namespace std; 3 4

c++11之二: 非静态成员变量初始化

在C++11中,允许非静态成员变量的初始化有多种形式:初始化列表; 使用等号=或花括号{}进行就地的初始化. 可以为同一成员变量既声明就地的列表初始化,又在初始化列表中进行初始化,只不过初始化列表总是看起来“后作用于”非静态成员. 也就是说,初始化列表的效果总是优先于就地初始化的. #include <iostream> 2 using namespace std; 3 class CBase{ 4 public: 5 CBase(){cout<<"mem default

回调函数中调用类中的非静态成员变量或非静态成员函数

有关这方面的问题,首先说一点: 回调函数必须是静态成员函数或者全局函数来实现回调函数,大概原因是普通的C++成员函数都隐含了一个函数参数,即this指针,C++通过传递this指针给成员函数从而实现函数可以访问类的特定对象的数据成员.由于this指针的原因,使得一个普通成员函数作为回调函数时就会因为隐含的this指针问题使得函数参数个数不匹配,从而导致回调函数编译失败. 基于上面的理论,如何在类中封装回调函数呢? 回调函数只能是全局函数或者静态成员函数,但是由于全局函数会破坏封装性,所以只能用静

关于C++静态成员函数访问非静态成员变量的问题

静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存.静态成员函数没有隐含的this自变量.所以,它就无法访问自己类的非静态成员 代码如下: class a{public:  static FunctionA()  {     menber = 1;  } private:  int menber;} 编译上述代码,出错.原因很简单大家都知道,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的

Java学习---静态成员变量和一般成员变量的区别

public class AccessProperty { int i=47;//改变加static int i=47; public void call(){ System.out.println("调用call()方法"); for(int i=0;i<3;i++){ System.out.println(i+""); if(i==2){ System.out.println("\n"); } } } public AccessProp

java static成员变量方法和非static成员变量方法的区别

这里的普通方法和成员变量是指,非静态方法和非静态成员变量首先static是静态的意思,是修饰符,可以被用来修饰变量或者方法. static成员变量有全局变量的作用       非static成员变量则没有全局变量的作用        局部变量是类的方法里面的变量静态static成员变量是指类的成员变量,他不属于类的对象,只单独属于类,被所有对象共享.当在类中改变他的值时,他在每个对象里面的值都会随之改变. 这也就是说在对象中不能改变他的值,只能在他所在的类中改变,如果他带有final的话(sta

C++对象模型:成员变量&lt;一&gt;非静态成员

非静态成员变量,分别两种可能,要么类自定义,要么继承而来.根据<深度探索C++对象模型>的解读. class X { private: int x,y,z; }; 在这个类中,有三个私有成员变量(不管私有,保护,或公有),都按照某个次序排列(一般根据定义的先后顺序),唯一需要注意的是:某些变量需要对齐填充.在内存中的排列次序依次为:x,y,z:假如需要对这三个变量进行操作,实际会在成员函数中填充一个指针,参照<深入浅出MFC>. class X { public: void f()