繁体   English   中英

内部类声明和初始化

[英]Inner class declaration and initialization

我习惯用C ++编写代码,但必须将项目从C ++转换为Java。 在C ++中使用数据结构非常简单。 我试图复制相同的东西,但如Java内部类和静态嵌套类 在线阅读了几个例子,并尝试了不同的版本,到目前为止这是我得到的:

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();

此语法适用于内部类(即非静态嵌套类)。 如果这是您想要的,请从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()方法中outerObj ,因为outerObjvalue是只有main方法知道的局部变量。

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

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必须是静态类:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM