Java Access实例化的对象

时间:2014-12-23 00:30:47

标签: java oop instantiation

我不知道如何访问从该对象实例化对象的类。

清晰度示例:

public class A {

    B b;
    int number = 5;

    public A() {
        b = new B();
    }
}

public class B {

    public B() {
        System.out.println(/*code to get the value of number*/);
    }
}

我无法将number传递给B

这在Java中是否可行?

3 个答案:

答案 0 :(得分:4)

对象本身并不知道实例化的位置,不是。

也就是说,您可以在子对象中添加对实例化对象的引用。这在板实现中很有用,因此tile或space可以为邻居提供板对象等参考。

对于您的示例,如果所有B都由相应的A实例化,则可以修改类:

public class A {

    B b;
    int number = 5;

    public A() {
        b = new B(this);
    }
}

public class B {

    public final A instant;

    public B(A a) {
        instant = a;
        System.out.println(a.number);
    }
}

实现相同效果的另一种方法是,如果所有B都是在A内构建的,那就是使B成为非静态内部类。这将使每个B访问其对应的A的数字字段。

public class A {
    B b;
    int number = 5;

    public A() {
        b = new B(this);
    }

    class B {
        public B() {
            System.out.println(number); //Has access because it must be constructed within an A instance
        }
    }
}

这显然更清晰,但使B内部类具有其他可能适用于您的项目的设计含义。

但是,如果你不知道实例化对象的类(如果它不总是A),那么这些方法都不会起作用。在这种情况下,您可以做的最好的事情是使参数构造类型B的{​​{1}}并根据需要进行转换以获取字段,或者使其具有共享行为的实例化类共享的某个接口必要。这是一个例子:

Object

答案 1 :(得分:0)

在像Java这样的面向对象语言中,首先需要提供基本上将所有属性设置为私有的封装,然后使用set来传递值,例如,如果要访问数字,则可以使用A usend关键字 extend 你也可以把属性号放在B类中然后你就可以做一些像a.getB()。setNumber()或getNumber()取决于你想要的getter用于读取值和setter用于设置值:

public class A {

  B b;
  private int number;

        public A() {
                b = new B();
        }

        public void setNumber(int number){
    this.number=number;
        }

        public int getNumber(){
            return number;
        }
}

然后在B班

public class B extends A {

    public class B(){
        setNumber(100);
    }

}

答案 2 :(得分:0)

public class A {

    B b;
    int number = 5;

    public A() {
        b = new B();
        b.setNum(number);
    }
}

public class B {
    int number;
    public B() {
        System.out.println(number);
    }
    public void setNum(int n) {
        number = n;
    }
}