从用于内部实例创建的外部类实例访问内部类实例

时间:2019-07-20 12:06:18

标签: java

假设我有一个“外部” 类,其中将“内部” 类作为嵌套的非静态类。

假设在main()中创建了名为“ a” “外部” 类的实例。 假设我使用“ a” 创建一个名为“ in” “ Inner” 实例。

我的问题是:如何从对象“ a”中获取实例“ in”中的变量,该实例“应为” a”的一部分?

以下是一个示例:

https://www.baeldung.com/java-synthetic

我尝试使用它,但是似乎超出了我的私有字符串字段。我尝试设置Inner实例的字符串,然后获取它-但我得到的只是空值。

public class Synthetic {
    public static void main(String[] args) {
        SyntheticMethodDemo a = new SyntheticMethodDemo();
        SyntheticMethodDemo.NestedClass in = a.new NestedClass();
        a.setNestedField("hello");
        System.out.println(a.getNestedField());
    }
} //this is my addition

class SyntheticMethodDemo {
    class NestedClass {
        private String nestedField;
    }

    public String getNestedField() {
        return new NestedClass().nestedField;
    }

    public void setNestedField(String nestedField) {
        new NestedClass().nestedField = nestedField;
    }
} //this is the code from the site

我期望由于运行main()而打招呼,但是我得到“空” 代替

2 个答案:

答案 0 :(得分:0)

SyntheticMethodDemo的获取和设置器中,您总是创建内部类NestedClass的新实例,操纵或检索nestedField的值,但从不存储对{{ 1}}实例。从那时起,Baeldung的例子是没有用的,并且具有误导性。

我对示例进行了调整,使其存储了嵌套类的实例,该实例应可使您的代码按预期运行:

NestedClass

答案 1 :(得分:0)

据我了解,您希望能够通过包含内部类的外部类的实例来访问内部类的字段。您可以这样保存对外部类的内部类的引用。

public class Synthetic {
   public static void main(String[] args) {
      SyntheticMethodDemo a = new SyntheticMethodDemo();
      SyntheticMethodDemo.NestedClass in = a.new NestedClass();
      a.setNestedField("Hello");
      System.out.println(a.getNestedField());
   } // this is my addition
}

class SyntheticMethodDemo {
   NestedClass nc;

   class NestedClass {
      private String nestedField;

      NestedClass() {
         nc = this;
      }
   }

   public String getNestedField() {
      return nc.nestedField;
   }

   public void setNestedField(String nestedField) {
      nc.nestedField = nestedField;
   }
} // this is the code from the site

我相信您的问题是,与内在和外在类存在一对一的对应关系,您无法摆脱。您始终可以从单个外部实例创建任意数量的独立内部类。但是,当您尝试从outer instance访问它们时,该instance不知道您要哪个inner instance。因此,您必须save或其他map中的所有内部实例data structure并指定一个id才能获得正确的内部实例。

这很容易做到,但是我不确定会带来什么好处。