阅读Tomcat代码是看到Bootstrap类中有对自身类型变量的定义,对于我这个土人来说还是比较稀奇的,于是google了下,就找到了下面的东西,又被我拿来主义了,感谢原创者!
(下面的文字转自http://loovle.iteye.com/blog/734888)
===========================================
问题:
如果java类里的成员变量是自身的对象,则新建该类对象时内存中怎么分配空间,我感觉好像死循环了。
不过我想的肯定是错的,因为很多类的成员变量是自身对象,举个例子:
Class A{
private String b ="Hello";
private A a = new A();
}
Class B{
public static void main(){
A p = new A();
}
}
在程序执行中,要new一个A类型的对象p,这时为对象p开辟内存空间,其中一部分存放字符串b Hello,另一部分存放对象a,可是我感觉a是一个对象,应该再开辟一块空间存放a这个对象,可是应该在里面放什么呢?一个是hello,另一个又是A类的对象?
搜到的答案:
你的程序运行的时候会产生一个栈溢出错误的异常
Exception in thread "main" java.lang.StackOverflowError
你的思路是对的,但是,在main方法中创一个A对象,而A对象在初始化自己成员的时候,又会创另一个A对象,从而造成死循环,最终导至内存溢出。
你的A类如下:
Class A{
private String b ="Hello";
private A a = new A();
}
通常程序不会像你这样写,而是
Class A{
private String b ="Hello";
private A a; //= new A();
public anymothod(...){
//在某条件满足时
a=new A();
}
}
也就是说类是自身成员的时候,通常不能初始化,而仅仅是一个定义,在满足某些条件的时候,才去初始化,否则必然导至内存溢出。
分享到:
相关推荐
java 使用类作为成员变量 java 使用类作为成员变量
Java 面向对象中的两类 变量 : 成员变量和局部变量
Java中的变量的详细介绍 。介绍成员变量和局部变量的区别。成员变量中的实例变量和静态变量的区变。
75.java成员变量与局部变量.zip75.java成员变量与局部变量.zip75.java成员变量与局部变量.zip75.java成员变量与局部变量.zip75.java成员变量与局部变量.zip75.java成员变量与局部变量.zip75.java成员变量与局部变量....
java 利用反射获取内部类静态成员变量的值操作.docx
Java 关键字修饰成员变量例子。
Java成员变量类变量局部变量的区别共5页.pdf.zip
C++,C 包含类两个类互相调用彼此的类成员变量和方法,里面介绍了如何在头文件中创建相互的类对象,简单易懂
java 使用静态成员变量计算内存中实例化的对象数目
1、写一个判断素数的过程。以整数作为参数,若为素数则输出True,否则输出False 2、 写两个函数,分别求两个数的最大公约数和最小公倍数 3、 编写一个过程,用来计算并输出: 4、 Fibonacci数列的第一项是0,第二项...
在A中定义有全局变量X(或类的静态成员变量),则在动态库B中访问的X,与可执行程序C中访问的X是同一个变量还是两个不同的变量? 答案:是两个不同的变量。 2. 工程中包含动态库A,动态库B,可执行程序C。C依赖于A和...
详细了解成员变量的覆盖问题,代码详细介绍,还有注释,易懂
类变量是类中的静态变量,是用static修饰的变量;实例变量就是类中的成员变量,没有用static修饰的。 类变量是所有对象公用的,实例变量是对象私有的;当一个对象将类变量进行修改后,这个类的其他所有对象访问这个类...
成员变量:随着对象的创建而存在,随着对象的消失而消失 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失 特别注意 成员变量和局部变量的名称可以一致,方法调用的时候采取就近原则
最近研究WPF,遇到并解决了一些难题(至少是初学者的入门难题),包括: 1)控件如何绑定数据? ...4)控件如何绑定类对象的成员变量? 5)每次加载页面时,都会重新初始化,如何保持数据不变?
Java成员变量局部变量静态变量成员方法全局方法等概念的区别共3页.pdf.zip