可以从A类实例中创建的另一个B类实例访问A类实例的字段

时间:2013-11-08 09:48:38

标签: java

我想知道是否可以从第一个类中创建的另一个类访问类字段中包含的信息。我把一些Java代码用于显示我想做的事情。

    public class A {
      public String c = new String();
      B b;
      ...
      ...
      ...
      public void doSomething() {

        b = new B();
      }
    }

    public class B {        

      ...
      ...
      ...
      public void retrieveInformationFromA() {

        // I need to retrieve the field "c" of A instance that's 
        // created the B instance 
      }
    }

注意:对于此代码的当前设计的适当限制,我无法在B中创建包含A类字段“c”的参数的构造函数。由于遗留代码,我必须尽可能避免更改现有代码。

我很感激任何帮助!

更新:我已经更正了代码,我忘了将公共修饰符添加到A中的字段“c”。

5 个答案:

答案 0 :(得分:1)

由于您没有为字段“c”指定任何可见性(公共,私有,受保护),因此暗示它是“受保护的”,即与A类相同的包中的所有类都可以直接访问该字段。

因此,如果你的A和B类在同一个包中,你可以直接从B类访问字段'c'。

如果它们不在同一个包中,则无法正常访问它,但需要使用反射(这应该是绝对最后的手段):How do I read a private field in Java?

编辑:但你仍然必须将对A类实例的引用传递给B类。如果你不能改变B类,那你就完全没有运气了。

答案 1 :(得分:1)

将字符串声明为静态

public class A {
  static String c = new String();

然后在B中访问它

  public void retrieveInformationFromA() {

     String info = A.c;

    // I need to retrieve the field "c" of A instance that's 
    // created the B instance 
  }

如果c需要不同或非静态

  public void retrieveInformationFromA() {


     A obj = new A();
     String info = obj.c;

    // I need to retrieve the field "c" of A instance that's 
    // created the B instance 
  }

答案 2 :(得分:1)

根据我的经验,这是不可能的。 被叫实例b除了你所传递的东西之外,不知道它周围的世界。 如果你不想要或不能将c声明为静态,你可以包括一个带有B类的setter来'c'向下。

另一种方法可能是一个中间的“InfoBase”类,它包含一个或多个不同类所需的字段。

答案 3 :(得分:1)

你无法检索A的字段“c”,因为它是A类的私有成员。在这种情况下访问字段使用getter setter(在这种情况下为c)或将其公开(一种非常糟糕的方法)。快乐编码:)

答案 4 :(得分:1)

你可以做这样的事情

// In class A
public void doSomething() {
    b = new B();
    b.retrieveInformationFromA(this);
}
...
// In class B
public void retrieveInformationFromA(A a) {
    String c = a.c; // This way you can get it
    // I need to retrieve the field "c" of A instance that's 
    // created the B instance 
}