内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()
方法中无效,因为 outerObj
和 value
是仅已知的局部变量到你的主要方法。
如果您希望外部实例更新它的任何内部实例,它必须获得对它的引用。这是一种方法:
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
)。
我习惯用 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()
方法中无效,因为 outerObj
和 value
是仅已知的局部变量到你的主要方法。
如果您希望外部实例更新它的任何内部实例,它必须获得对它的引用。这是一种方法:
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
)。