【问题标题】:Inner class declaration and initialization内部类声明和初始化
【发布时间】:2015-08-29 20:29:25
【问题描述】:

我习惯用 C++ 编写代码,但必须将项目从 C++ 转换为 Java。在 C++ 中,使用数据结构非常简单。我正在尝试复制相同的内容,但例如 Java inner class and static nested class。在网上阅读了几个例子,并尝试了不同的版本,到目前为止,我得到了:

public class Main {
  public static void main( String[] args ) {
  ...
    ClassOuter outerObj = new ClassOuter();

    ClassOuter.DataInner value = outerObj.new ClassOuter.DataInner();
  }
}

class ClassOuter{

  public static class DataInner{
    public int x;
  }
  ...
  protected void getNo()
  { value.x=Integer.parseInt("493"); 
  }
}

但是,当我尝试编译时,它给了我错误:

$ javac -cp "./" Main.java
Main.java:15: error: '(' expected
    ClassOuter.DataInner value = outerObj.new ClassOuter.DataInner();

关于这里缺少什么的任何线索?

【问题讨论】:

    标签: java class object nested inner-classes


    【解决方案1】:
    ClassOuter.DataInner value = outerObj.new ClassOuter.DataInner();
    

    此语法适用于内部类(即非静态嵌套类)。如果这是您想要的,请从 public static class DataInner 中删除 static 关键字。

    编辑:

    也改变

    ClassOuter.DataInner value = outerObj.new ClassOuter.DataInner();
    

    ClassOuter.DataInner value = outerObj.new DataInner();
    

    使用封闭实例初始化内部实例时,不指定外部类型。

    并且outerObj.value.x=Integer.parseInt("493"); 行在您的外部类的getNo() 方法中无效,因为outerObjvalue 是只有您的主方法知道的局部变量。

    如果你希望你的外部实例更新它的任何内部实例,它必须获得对它的引用。这是一种方法:

    public class Main {
      public static void main( String[] args ) {
      ...
        ClassOuter outerObj = new ClassOuter();    
        ClassOuter.DataInner value = outerObj.new DataInner();
        outerObj.setInner (value);
      }
    }
    
    class ClassOuter{
    
      public static class DataInner{
        public int x;
      }
      ...
      private DataInner inner = null;
      public void setInner (DataInner inner) {
          this.inner = inner;
      }
      protected void getNo()
      {
          inner.x=Integer.parseInt("493"); 
      }
    }
    

    【讨论】:

    • @ThiagoOliveira `ClassOuter.this.x=Integer.parseInt("493");` 错了,我编辑了它。我错误地认为那行在你的内部类中,但它在你的外部类中。查看我的最后一次编辑。
    • @ThiagoOliveira 可以有多个内部类实例,它们都具有相同的外部封闭实例。为了让你的外部实例更新它的任何内部实例,它必须获得对它们的引用。
    • 再次感谢。事实上,我需要的是: ClassOuter.this.x=Integer.parseInt("493");基本上这个想法是让我的类包含而不是单独传播几个数据,将所有数据放在一起。 DataInner 类确实在 ClassOuter 中。无论如何,可以在其中初始化或包含对象(“值”)?
    【解决方案2】:

    如果 DataInner 必须是静态类:

    public class Main {
        public static void main(String[] args) {
            ClassOuter outerObj = new ClassOuter();
            ClassOuter.DataInner value = new ClassOuter.DataInner();
        }
    }
    
    class ClassOuter {
        public static class DataInner {
            public int value;
        }
    }
    

    在这种情况下,DataInner 没有引用 ClassOuter 实例。

    如果 DataInner 不能是静态类。

    public class Main {
        public static void main(String[] args) {
            ClassOuter outerObj = new ClassOuter();
            ClassOuter.DataInner value = outerObj.newInner();
        }
    }
    
    class ClassOuter {
        public class DataInner {
            public int value;
        }
        public DataInner newInner() {
            return new DataInner();
        }
    

    在这种情况下,DataInner 引用了 ClassOuter 实例 (ClassOuter.this)。

    【讨论】:

      猜你喜欢
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多