遇到如下一个问题:
假如现在有6个类,分别是A,B,C,D,E,F
在A类里创建了B类的对象(B b=new B();)
在B类里创建了C类的对象(C c=new C();)
在C类里创建了D类的对象(D d=new D();)
在D类里创建了E类的对象(E e=new E();)
在E类里创建了F类的对象(F f=new F();)
假设程序从A类一直执行到了F类里。
现在我要从F类里调用D类里的数据,然后再调用B类里的数据,该如何操作?
(原来创建了D类的对象,如果现在要在F类里再创建一个D的对象,就是开辟了一个新的对象空间,原来存储在D类的数据就不能被F类调用到了!用什么更好的办法?????)

解决方案 »

  1.   

    像你这种这么多层的调用,在实际项目中很常见,并没有什么问题。需要在F类中调用D类的中的数据,比较常用的方式是一层一层往下传,D传给E,E再传给F。其他的以此类推。
      

  2.   

    public class ObjectReferencing {    public static class A {    }    public static class B {        public A a = new A();
        }    public static class C {        public B b = new B();
        }    public static class D {
            
            public C c = new C();
        }    /////////////////////////////////////////////////////////    public static void main(String[] args) {
            D d = new D();        System.out.println("c is " + d.c);
            System.out.println("b is " + d.c.b);
            System.out.println("a is " + d.c.b.a);
        }
    }这样的引用都是很正常的。
      

  3.   

    A a = new A();
    F f = a.b.c.d.e.f;
    B b = a.b;
    D d = a.b.c.d;
    然后就可以调了吧....
      

  4.   

    按你目前的设计来看是办不到的,因为你的F类对象没有直接或间接的持有之前创建的D类对象的引用。要想让F对象能找到D的对象,只能在F类里加一个D对象引用作为成员,并且将D对象赋给这个成员;当然也可以间接得到,比如,F里面有C,再通过C找D。
      

  5.   

    在每一个类里都加一个域和一个有参构造器,把能够创建它的对象传递进来并存储,不过我不知道这么写的意义是是什么,也不知道对你有没有用,凑合着看一下思路吧package com.test;class A { public void test() {
    B b = new B(this);
    }

    public void print() {
    System.out.println("A ...");
    }}class B {
    public A a; public B(A a) {
    this.a = a;
    } public void test() {
    C c = new C(this);
    }

    public void print() {
    System.out.println("B ...");
    }
    }class C {
    public B b; public C(B b) {
    this.b = b;
    }

    public void test() {
    D d = new D(this);
    }

    public void print() {
    System.out.println("C ...");
    }
    }public class D { public C c;

    public D(C c) {
    this.c = c;
    }

    public static void main(String[] args) {
    D d = new D(new C(new B(new A())));
    d.c.b.a.print();
    }}