java - 关于java类嵌套的一个疑问

标签 java types inner-classes variable-declaration

public class Outer{
    public class Inner{
    }
}

public class Main {
    public static void main(String[] args) {
        Outer objOut = new Outer();
        //Outer.Inner object1= objOut.new Inner();  // runes without a problem
        //objOut.Inner object2= objOut.new Inner(); //gives error
    }
}

这听起来有点业余,但是,Outer.InnerobjOut.Inner 之间有什么区别。

最佳答案

您不能将一个变量名用作另一个变量的类型,这是您尝试使用objOut.Inner 做的事情。变量的类型是 Inner(或可选的 Outer.Inner)。

因为 Inner 是一个 inner class ,它与其外部类(其封闭实例)的实例相关联。当您创建它的一个实例时,您可以选择¹指定它关联的对象实例,这就是您在 objOut.new Inner 中所做的。

这个例子可能有助于使它更清楚一点:

public class Example {
    private String str;

    public class Inner {
        void show() {
            // Show the string for the Example this Inner is part of
            System.out.println(Example.this.str);
        }
    }

    public Example(String s) {
        this.str = s;
    }

    public static void main(String[] args) {
        Example e1 = new Example("e1");
        Example e2 = new Example("e2");
        Inner i1 = e1.new Inner();
        i1.show(); // "e1"
        Inner i2 = e2.new Inner();
        i2.show(); // "e2"
    } 
}

Live Copy

注意 i1 Inner 实例如何获取 e1 作为其封闭的 Example 实例,因此看到 e1str,但 i2 获取 e2 作为其封闭实例,因此它看到 e2str

我建议 this Java tutorial获取更多信息。


¹ 有时它不是可选的,例如在我上面的 Example 类中,因为在使用 new Inner 的地方,没有它可以使用的默认实例。它在 Exampleinstance 方法中是可选的,但在那个 static 方法中不是。

关于java - 关于java类嵌套的一个疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58048344/

相关文章:

java - 未能在错误的项目上执行目标

java - 为 Sagemaker Java SDK 加载非 s3 数据源

java - 如何hook到java静态方法?

java - opengl es 2.0 填充顶点和索引缓冲区

c++ - 如何制作具有非特定类型的 vector 参数?

c++ - 为什么 Visual C++ 不能部分特化模板中的类?

c# - 在 C# 中记录对象的所有属性。如何记录内部对象属性?

class - 方法未定义(类型没有方法)

c - 左值和函数结果——依赖?

Java - 这些是哪些类型的类;哪个是匿名内部类?