java是否可以在定义类时创建类对象
有如下例子:
public class A
{
private A aa = new A();
}
public class Test
{
public static void main(String[] args)
{
A a = new A();
/*
Exception in thread "main" java.lang.StackOverflowError
at com.booway.danlimoshi.formal.A.<init>(A.java:5)
*/
}
}
提示错误:
Exception in thread “main” java.lang.StackOverflowError
at test1$abc.(test1.java:4)
很明显,堆栈溢出了。为什么呢?
在java中,只有调用new的方法才能创建对象的实例,在内存中分配对象的空间。所以,如果在定义的时候就定义自身类的对象,就会导致递归创建对象的现象,创建了对象aa,因为aa是一个A类的实例,那么aa中还有一个aa对象,还要创建一个aa对象,为其分配内存…………,这样就会导致递归创建对象,结果就是内存被消耗殆尽。
在来看下面一个例子:
public class HungryMan
{
private static final HungryMan instance = new HungryMan();
private HungryMan()
{
super();
System.out.println("饿汉单例模式");
}
public static HungryMan getInstance ()
{
return instance;
}
}
public class Test
{
public static void main(String[] args)
{
HungryMan.getInstance();//饿汉单例模式
}
}
运行正常为什么,因为它是类加载时加载这个变量,而不是通过new,所以它不会出现上面的递归创建对象的现象运行正常。静态变量它不在是先要通过new 类对象来,才能使用这个变量,它先于类对象出现,通过类名来使用。