2016-04-12 11 views
0
Class A 
{ 
B b1=new B(); 
} 
Class B 
{ 
A a1=new A(); 
} 

Böyle bir şeyden bahsediyorum? Mümkün mü?2 A ve B sınıfı olduğunu varsayalım, A'da A ve A'da A'nın bir nesnesini yaratmak mümkün mü?

+2

Bu Kendinizi kolayca deneyebileceğiniz bir şey gibi görünüyor. – nhouser9

+0

Bu tür bir şey gerektiren bir proje üzerinde çalışıyorum ama programı çalıştırmak mümkün değildi, bu yüzden emin olmak istedim. – wayne

+1

Eclipse sadece bir IDE olduğundan, hangi dilde konuştuğunuzdan bahsetmek yararlı olabilir ... –

cevap

3

Evet, yapabilirsiniz. Aşağıdaki gayet derler:

class A { 
    B b1 = new B(); 
    public A() { 
     System.out.println("A constructor"); 
    } 
} 
class B { 
    A a1 = new A(); 
    public B() { 
     System.out.println("B constructor"); 
    } 
} 

public class HelloWorld { 
    public static void main(String []args) { 
     A a0 = new A(); 
     System.out.println("Done"); 
    } 
} 

Ancak çıktıda görüldüğü gibi, genellikle kötü bir fikir:

Exception in thread "main" java.lang.StackOverflowError 
    at B.<init>(HelloWorld.java:8) 
    at A.<init>(HelloWorld.java:3) 
    at B.<init>(HelloWorld.java:8) 
    at A.<init>(HelloWorld.java:3) 
    at B.<init>(HelloWorld.java:8) 
    : 
    at A.<init>(HelloWorld.java:3) 
    at B.<init>(HelloWorld.java:8) 
    at A.<init>(HelloWorld.java:3) 
    at B.<init>(HelloWorld.java:8) 

bir A denemeden inşaat bir B oluşturmak ve bu gerçeği B yapılışı bir A oluşturmaya çalışır, sonunda sonsuz miktarda yer kaplayacaksınız, sonuçta yığın alanı tükeniyor. güvenle iki nesneyi olabilir

Sen birbirlerine atıfta ama bu genelde inşaat aşaması sonrasında bitti, gibi bir şey:

class A { 
    B b; 
    public A() { 
     System.out.println("A constructor"); 
    } 
    public void setOther(B bx) { 
     System.out.println("A linker"); 
     b = bx; 
    } 
} 
class B { 
    A a; 
    public B() { 
     System.out.println("B constructor"); 
    } 
    public void setOther(A ax) { 
     System.out.println("B linker"); 
     a = ax; 
    } 
} 
public class HelloWorld{ 
    public static void main(String []args){ 
     A a0 = new A(); 
     B b0 = new B(); 
     a0.setOther(b0); 
     b0.setOther(a0); 
     System.out.println("Done"); 
    } 
} 

o çıkışı gösterir:

A constructor 
B constructor 
A linker 
B linker 
Done 
+0

dilidir. Bunun için bir çözüm var mı? – wayne

+0

"Geçici çözüm", neyi başarmak istediğinizi bulmaktır. Kurucusu, sonsuz sayıda nesnenin oluşturulmasına neden olan bir sınıfa sahip olmak istemezsiniz. Fakat, ne istiyorsun? – ajb

+0

Sınıfın her biri, diğer sınıfın kullanması gereken yöntemleri kullanıyor, dolayısıyla diğer sınıfın bir nesnesini oluşturmam gerekiyor. – wayne

İlgili konular