持有当前类的实例和重载问题解析

来源:互联网 发布:mac mount samba 编辑:程序博客网 时间:2024/05/24 15:41

持有当前类的实例和重载问题解析

当某个类的对象持有当前类的实例时,某个实例递归地引用当前类的实例很容易导致构造器递归调用。不过在一些特定的情况下,程序必须让某个类的一个实例持有当前类的另一个实例,例如链表,每个节点都持有一个引用,该引用指向下一个链表节点。

对于一个Java类而言,它的一个实例持有当前类的另一个实例的引用是被允许的,只要程序初始化它所持有当前类的实例时不会引起构造器递归。

public class InstanceTest1{

     private String name;

     private InstanceTest1instance;

     public InstanceTest1(){

       

     }

     public InstanceTest1(String name){

       instance = newInstanceTest1();

       this.name =name;

     }

     public String toString(){

       return "InstanceTest11[instance="+instance+"]";

     }

     public static void main(String[] args){

       InstanceTest1 in = newInstanceTest1();

       InstanceTest1 in2 = newInstanceTest1("testname");

       System.out.println(in);

       System.out.println(in2);

     }

}

Output:

InstanceTest11[instance=null]

InstanceTest11[instance=InstanceTest11[instance=null]]

上面程序中定义了一个InstanceTest1类。该类的实例持有另一个InstanceTest1对象,程序只要不再InstanceTest1构造器的初始化代码里形成递归调用,这个类就是安全的。上面程序创建了2个InstanceTest1对象,一个持有instance属性为null,另一个持有instance是有效的。

如果改为下面就会出现递归调用:

public static void main(String[] args){

       InstanceTest1 in = new InstanceTest1("");

       InstanceTest1 in2 = new InstanceTest1("testname");

       in.instance = in2;

       in2.instance = in;

       System.out.println(in);

       System.out.println(in2);

     }

Exceptionin thread "main" java.lang.StackOverflowError

      at java.lang.StringBuilder.append(UnknownSource)

      atjava.lang.StringBuilder.<init>(Unknown Source)

      at InstanceTest1.toString(InstanceTest1.java:13)

      at java.lang.String.valueOf(UnknownSource)

      at java.lang.StringBuilder.append(UnknownSource)

      at InstanceTest1.toString(InstanceTest1.java:13)

      at java.lang.String.valueOf(UnknownSource)

      at java.lang.StringBuilder.append(Unknown Source)

原创粉丝点击