【问题标题】:Does Java implicitly use a constructor (or an object) with the new operator?Java 是否隐式使用带有 new 运算符的构造函数(或对象)?
【发布时间】:2014-01-11 12:46:25
【问题描述】:

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

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

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

【问题讨论】:

标签: java new-operator dot-operator


【解决方案1】:

表格

someObject.new InnerClass()

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-29
        • 2021-07-27
        • 2017-11-04
        • 2017-04-09
        • 2012-03-07
        • 2014-01-22
        • 1970-01-01
        相关资源
        最近更新 更多