Java是否隐式使用带有new运算符的构造函数(或对象)?

时间:2013-12-23 10:05:50

标签: java new-operator dot-operator

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

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

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

3 个答案:

答案 0 :(得分:3)

表格

someObject.new InnerClass()

仅用于inner classes。内部类的实例必须与其封闭类的实例相关联。通常,封闭实例是this,无需使用虚线表示法,但是当您想要显式创建与不同对象关联的内部类的实例时,上面的语法就是您使用的。

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

答案 1 :(得分:1)

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

提供此表单是为了允许您在一个步骤中构造外部和内部对象,并保持对内部对象的引用。我从来没有找到太多用途,但知道它存在是很方便的。

答案 2 :(得分: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();
    }
}

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