内部类声明和初始化

时间:2015-06-14 06:39:00

标签: java class object nested inner-classes

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

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

2 个答案:

答案 0 :(得分:5)

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

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

编辑:

同时更改

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"); 
  }
}

答案 1 :(得分:1)

如果DataInner必须是静态类:

=

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

如果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实例(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(); } )。