0

我想知道是否可以从在第一个类中创建的另一个类访问一个类的字段中包含的信息。我放了一段 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”。

4

5 回答 5

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 
}
于 2013-11-08T09:56:02.943 回答
1

根据我的经验,这是不可能的。被调用的实例 b 不知道它周围的世界,除了你传下来的东西。如果您不想或不能将 c 声明为静态,则可以包含一个带有 B 类的 setter 来传递“c”。

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

于 2013-11-08T09:53:32.983 回答
1

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

于 2013-11-08T09:53:56.510 回答
1

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

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

如果不在同一个包中,则无法正常访问,需要使用反射(这应该是绝对不得已的办法):Java中如何读取私有字段?

编辑:但是您仍然必须将对 A 类的实例的引用传递给 B 类。如果您不能更改 B 类,那您就完全不走运了。

于 2013-11-08T09:52:05.897 回答
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 
  }
于 2013-11-08T09:52:18.850 回答