【问题标题】:Default java Constructor默认 java 构造函数
【发布时间】:2012-06-19 14:55:48
【问题描述】:

由于我是 Java 新手,所以我想知道, 1. 创建一个空类时定义了多少个默认构造函数? 2.我需要定义复制构造函数还是像C++一样自动定义?

【问题讨论】:

  • 每个问题一个问题。

标签: java class constructor


【解决方案1】:

只有一个默认构造函数,只有当你没有为一个类声明构造函数时才会定义它。否则,声明的构造函数将是唯一的构造函数。如果不包含构造函数,编译器会插入相当于

的代码
public ClassName() {
  super();
}

另外,如果你为一个类声明了构造函数,而你没有显式定义超类的构造函数调用,编译器会在超类中插入一个参数匹配调用。

public ClassName extends SuperClassName {

  public ClassName(String item, List stuff) {
    // no explicit super class constructor called
    ...
  }

}

在编译器中被转换成类似的东西

public ClassName extends SuperClassName {

  public ClassName(String item, List stuff) {
    // explicit super class constructor call to SuperClassName(item, stuff);
    super(item, stuff); 
    ...
  }

}

要定义一个复制构造函数,没有特殊的语法,你基本上定义了一个构造函数,它将你的类的另一个实例作为参数。

public ClassName(ClassName other) {
  field = other.field;
  field2 = other.field2;
  field3 = new ArrayList(other.field3);
  ...
}

没有默认的拷贝构造函数,实际上没有拷贝构造函数,只有构造函数。如果您决定创建一个或多个似乎复制对象的东西,那就这样吧。

Java 需要较少类型的项目的原因在某种程度上与不重载基本运算符有关。如果您不对= 赋予更多含义,那么您就不需要那么多类型的构造函数来支持不同的对象分配方法。

= 可以如此简单地使用的原因之一是因为 Java 只传递引用,这有点像指针;但是,它们是强类型的,你不能做任何指针数学,也不能访问偏移量。因此,它们仅适用于赋值和通过引用传递,这可以防止大多数指针问题。

【讨论】:

    【解决方案2】:

    1.当我创建一个空类时,定义了多少个默认构造函数?

    类如

    class MyClass {
    }
    

    有一个默认(空)构造函数,其行为类似于

    ...
        public MyClass() {
        }
    ...
    

    2.我需要定义复制构造函数还是像 C++ 中那样自动定义?

    Java 中没有内置复制构造函数的概念,这有一个根本原因:

    在 Java 中,变量永远不能包含对象(它只能包含对对象的引用)。所以在做foo(obj)的时候,那么obj引用的对象就不需要复制了。

    要复制一个对象,您通常会创建一个构造函数,例如

    ...
        public MyClass(MyClass objToCopy) {
            this.field1 = objToCopy.field1;
            ...
            this.fieldN = objToCopy.fieldN;
        }
    ...
    

    或者你依赖clone()机制。

    相关问题:

    【讨论】:

    • 默认构造函数实际上包含一个super();,不是吗?
    • 我会说第二部分“如果你想要一个复制构造函数,你必须自己写”。
    • @brimborium,对。这隐含在构造函数中,例如public MyClass() {}。
    • 我刚刚查了一下。根据 JLS,默认构造函数确实包含super();。还值得注意的是,如果至少提供了一个构造函数,则不会生成默认构造函数。
    • @aioobe 哦,真的吗?但仅适用于无参数构造函数?
    【解决方案3】:

    如果你不创建任何构造函数,那么编译器会隐式添加一个默认构造函数。它是非参数化的构造函数。

    class SomeClass{
    
    public SomeClass() // all this is implicitly added if you don't specify anything.
    {
    super();
    }
    
    }
    

    来自documentation:

    编译器会自动为任何类提供无参数的默认构造函数 没有构造函数。此默认构造函数将调用的无参数构造函数 超类。在这种情况下,如果超类没有,编译器会报错 有一个无参数构造函数,因此您必须验证它是否存在。如果你的班级没有 显式超类,那么它有一个 Object 的隐式超类,它确实有一个 无参数构造函数。

    而在 Java 中,没有复制构造函数之类的东西。如果你显式定义一个,那么这是一个不同的问题,但编译器永远不会在 Java 中自动定义这样的东西。

    【讨论】:

      【解决方案4】:

      以上所有答案都很好..只需再添加一件事就更清楚了..默认构造函数是编译器在您未定义任何构造函数时自行添加的构造函数... 按照上面的答案:

      public ClassName() { super(); }

      但是如果你自己在类中编写构造函数......就像你在类中编写相同的构造函数一样......从技术上讲,这个构造函数不会被称为默认构造函数......

      我希望你明白了..

      【讨论】:

        【解决方案5】:

        如果没有指定构造函数,则自动定义一个空的构造函数。 只要您指定了一个或多个构造函数,就只会定义这些构造函数。

        没有复制构造函数,但 Java 中的每个类都从 Object 作为 clone() 方法扩展而来。

        【讨论】:

          猜你喜欢
          • 2013-06-08
          • 2015-06-26
          • 1970-01-01
          • 1970-01-01
          • 2016-06-05
          • 1970-01-01
          • 2014-03-24
          • 2016-07-23
          相关资源
          最近更新 更多