2

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

4

5 回答 5

7

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()机制。

相关问题:

于 2012-06-19T14:57:46.910 回答
7

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

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 只传递引用,这有点像指针。但是,它们是强类型的,你不能做任何指针数学,也不能访问偏移量。因此,它们仅适用于赋值和通过引用传递,这可以防止大多数指针问题。

于 2012-06-19T14:57:40.060 回答
1

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

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

于 2012-06-19T15:06:51.987 回答
1

最重要的是,答案都很好..只需再添加一件事就可以更清楚地了解..默认构造函数是当您没有定义任何构造函数时编译器会自行添加的构造函数...根据上面的 ans :

public ClassName() { super(); }

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

我希望你明白这一点..

于 2012-06-19T15:01:44.460 回答
1

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

class SomeClass{

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

}

文档中:

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

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

于 2012-06-19T14:56:42.840 回答