内class声明和初始化

Inner class declaration and initialization

我习惯用 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();

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

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

此语法适用于内部 classes(即非静态嵌套 classes)。如果这是您想要的,请从 public static class DataInner.

中删除 static 关键字

编辑:

也改

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

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

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

并且 outerObj.value.x=Integer.parseInt("493"); 行在外部 class 的 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"); 
  }
}

如果DataInner必须是静态的class:

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 不能是静态的class。

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)。