1

今天我了解到您可以将new运算符与分隔符(.或“点运算符”)一起使用。这让我想知道 Java 是否隐式地对所有出现的 new 运算符使用相同的技术。

以下语句创建一个新的“InnerClass 对象”。它使用新的 ParentClass 对象执行此操作,使用.new. 但是,new此语句中的第一个运算符前面没有构造函数(或对象)。那么,Java 会在编译时添加一个吗?我尝试Main()在此语句中显式添加一个 ( ),但代码无法编译。

ParentClass.InnerClass ic = new ParentClass().new InnerClass();
4

3 回答 3

3

表格

someObject.new InnerClass()

仅用于内部类。内部类的实例必须与其封闭类的实例相关联。通常,封闭实例是this,不需要点分符号,但是当您想显式创建与不同对象关联的内部类的实例时,您可以使用上述语法。

Java 中的大多数类都不是内部类。不需要封闭实例,因此 Java 不会new Something()在所有new调用之前隐式插入。(如果是这样,它必须new Something()在它插入的调用之前插入,并且new Something()这些调用之前,你根本无法构造任何东西。)

于 2013-12-23T10:11:03.130 回答
1

我没有看过它的内部结构,但让我们首先假设编译器添加了一个对象以在编译时进行新的操作。这意味着我们所有的类都是另一个类的内部类。由于它们没有在另一个类中声明,因此情况并非如此。所以:不,它不会在编译时添加这样的东西。

实际上,让我们分解一下。

public class Outer {

    String strHello = "Hello ^^";

    public void printHello() {
        System.out.println(strHello);
    }

    public static void main(String[] args) {

        // This will print: Hello ^^
        Outer outer = new Outer();
        outer.printHello();

        // This will print: Hello ^^
        new Outer().printHello();
    }
}

我猜你以前见过这样的代码。它只是调用实例化类的方法。点符号也可用于访问变量和内部类。在上面我们已经将它用于实例方法。使用关键字static允许类的所有实例甚至单独的类共享方法和变量。

public class Outer {

    static String strHello = "Hello ^^";

    public static void printHello() {
        System.out.println(strHello);
    }

    static class StaticInner {
    }

    static class Inner {
    }

    public static void main(String[] args) {

        // Prints: Hello ^^
        Outer.printHello();

        // Constructs a new Example.StaticInner
        Outer.StaticInner inner = new Outer.StaticInner();

        // Constructs a new Outer.Inner     
        Outer.Inner inner = new Example().new Inner();

        // Constructs a new Outer.Inner
        Example ex = new Example();
        Outer.Inner inner = ex.new Inner();
    }
}

上面的代码使用了一个静态内部类,希望能证明一个内部构造函数就像任何其他构造函数一样。但是,因为它在另一个类中,我们需要通过另一个(外部)类来访问它。它不是静态内部类,由于访问修饰符,我们需要使用实例来访问它。

于 2013-12-23T10:47:25.640 回答
1

外部类和静态内部类可以自己创建,无需任何父元素。非静态内部类虽然需要是父元素的一部分。因为外部类和静态类不存在父元素的概念,所以不可能引用该父元素。

提供此表单是为了让您可以一步构建外部对象和内部对象,并且只保留对内部对象的引用。我从来没有发现它有多大用处,但知道它的存在很方便。

于 2013-12-23T10:12:25.233 回答