【问题标题】:Java - Make inner classes be able to modify outer classJava - 使内部类能够修改外部类
【发布时间】:2015-02-25 06:30:06
【问题描述】:

假设我有两个类:

public class OuterClass {
    String string = "helloworld";

    public class InnerClass {

        public void main(String[] args) {
            string = "lol";
            System.out.println(string);
        }
    }

    public void changeString() {
        InnerClass c = new InnerClass();
        c.changeString();
        System.out.println(string);
    }
}

输出将是:

lol
helloworld

有没有办法让内部类能够修改外部类的变量? 感谢您提前提供的所有帮助。

【问题讨论】:

  • 类中的非静态变量不能修改,对象实例中的变量可以修改
  • 你也叫c.changeString(),非静态是InnerClass.changeString(),它不会编译。

标签: java class inner-classes


【解决方案1】:

因为变量 stringstatic 您现在可以从类中的任何类访问它,该变量在 ieInnerClass中定义>,因此您可以从 InnerClassOuterClass 更改变量的值。所以代码将是:

public class OuterClass {
    public static String string = "helloworld";

    public class InnerClass {
        string = "lol";
    }

    public static void main(String[] args) {
        System.out.println(string);
    }
}

希望这会有所帮助。

【讨论】:

  • string = "lol" 不给出编译问题吗?还是我在这里遗漏了什么?
【解决方案2】:

将外部类的引用传递给构造函数中的内部类

public class InnerClass {

    private OuterClass parent;

    public InnerClass(OuterClass parent)
    {
       this.parent = parent;
    }

    public void changeString() 
    {
        parent.string = "lol";
        System.out.println(string);
    }
}

然后类内部将使用new InnerClass(this) 进行实例化。

【讨论】:

    【解决方案3】:

    我对内部类访问外部类对象并修改它的代码进行了更改。

    public class OuterClass
    {
        String string = "helloworld";
    
        public class InnerClass
        {
            public void changeString()
            {
                string = "lol";
            }
        }
        public static void main(String[] args)
        {
            OuterClass outerClass = new OuterClass();
            System.out.println(outerClass.string);
            outerClass.new InnerClass().changeString();
            System.out.println(outerClass.string);
        }
    }
    

    它的输出是:

    helloworld
    lol
    

    【讨论】:

    • 这对我有帮助。谢谢。
    【解决方案4】:

    您需要将外部类的实例传递给内部类的构造函数,然后将其分配给成员变量,然后您可以引用该成员变量

    【讨论】:

      【解决方案5】:

      您的示例无法编译,但您可以使用类似的方法修复它

      static String string = "helloworld";
      
      static class InnerClass {
          public void changeString() {
              string = "lol";
              System.out.println(string);
          }
      }
      
      public static void main(String[] args) {
          InnerClass c = new InnerClass();
          c.changeString();
          System.out.println(string);
      }
      

      哪个输出(按要求)

      lol
      lol
      

      编辑

      根据您在下面的评论,并使用 Java 8

      String string = "helloworld";
      public class InnerClass {
          public void changeString() {
              string = "lol";
              System.out.println(string);
          }
      }
      
      public static void main(String[] args) {
          OuterClass m = new OuterClass();
          InnerClass c = m.new InnerClass();
          c.changeString();
          System.out.println(m.string);
      }
      

      【讨论】:

      • 但这完全不同,因为它不再修改实例变量。
      猜你喜欢
      • 1970-01-01
      • 2014-10-12
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多