有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

oop Java访问实例化的对象

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

为清晰起见,示例:

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) 个答案

  1. # 1 楼答案

    对象本身并不知道它们在哪里被实例化,不知道

    也就是说,您可以在子对象中添加对实例化对象的引用。这在电路板实现中很有用,因此平铺或空格可以为邻居等引用电路板对象

    例如,如果所有的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 A内构造,则使Ba成为非静态的内部类。这将允许每个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),那么这两种方法都不起作用。在这种情况下,您可以做的最好的事情是要么将参数设置为构造类型为ObjectB并根据需要强制转换以获取字段,要么将其设置为实例化类共享的某个接口,并根据需要使用共享行为。下面是一个例子:

    public interface Instantiator{
        public int getNumber();
    }
    
    public class A1 implements Instantiator{
        private B b;
        public A() {
            b = new B(this);
        }
    
        public int getNumber(){
            return 5;
        }
    }
    
    public class C implements Instantiator{
        private B b;
        private int count = 0;
    
        public C(){
            count++;
            b = new B(this);
        }
    
        public int getNumber(){
            return count;
        }
    }
    
    public class B {
    
        public final Instantiator instant;
    
        public B(Instantiator a) {
            instant = a;
            System.out.println(a.getNumber());
        }
    }
    
  2. # 2 楼答案

    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;
        }
    }
    
  3. # 3 楼答案

    在像Java这样的面向对象语言中,首先需要提供封装,基本上是将所有的atribute私有,然后使用set传递值,例如,如果你想访问数字,你可以从usend关键字中继承extend,也可以将atribute数字放在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);
        }
    
    }