Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
默认java构造函数_Java_Class_Constructor - Fatal编程技术网

默认java构造函数

默认java构造函数,java,class,constructor,Java,Class,Constructor,由于我是java新手,我想知道, 1.当我创建一个空类时,定义了多少默认构造函数? 2.是否需要定义复制构造函数,或者它是在C++中自动定义的?< p>如果不做任何构造函数,编译器只会添加一个默认构造函数。它是非参数化构造函数 class SomeClass{ public SomeClass() // all this is implicitly added if you don't specify anything. { super(); } } 从: 编译器自动为任何类提供无参数的默

由于我是java新手,我想知道, 1.当我创建一个空类时,定义了多少默认构造函数?
2.是否需要定义复制构造函数,或者它是在C++中自动定义的?

< p>如果不做任何构造函数,编译器只会添加一个默认构造函数。它是非参数化构造函数

class SomeClass{

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

}
从:

编译器自动为任何类提供无参数的默认构造函数 没有构造函数。此默认构造函数将调用的无参数构造函数 超类。在这种情况下,如果超类不存在,编译器将发出抱怨 有一个无参数构造函数,所以必须验证它是否有。如果你的班级没有 显式超类,然后它有一个对象的隐式超类,它确实有一个 没有参数构造函数

class SomeClass{

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

}

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

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

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

1。创建空类时定义了多少默认构造函数?

一类,如

class MyClass {
}
有一个默认(空)构造函数,其行为类似

...
    public MyClass() {
    }
...
2。是否需要定义复制构造函数,还是在C++中自动定义?<强> < /p> Java中没有内置复制构造函数的概念,这有一个根本原因:

在Java中,变量永远不能包含对象(它只能包含对对象的引用)。因此,在执行
foo(obj)
时,不需要复制
obj
引用的对象

要创建对象的副本,通常需要创建一个构造函数,例如

...
    public MyClass(MyClass objToCopy) {
        this.field1 = objToCopy.field1;
        ...
        this.fieldN = objToCopy.fieldN;
    }
...
或者您依赖于
clone()
机制

相关问题:


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

public ClassName(){super();}

但是如果你自己在类中编写构造函数。。。就像你在课堂上自己写的一样。。从技术上讲,此构造函数不会被称为默认构造函数


我希望你明白了

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


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

默认构造函数实际上包含一个
super(),不是吗?我会说第二部分“如果你想要一个复制构造函数,你必须自己编写”。@brimborium,对。它隐式地存在于构造函数中,比如
public MyClass(){}
。根据JLS,默认构造函数确实包含一个
super()。还值得注意的是,如果至少提供了一个构造函数,则不会生成默认构造函数。@aioobe哦,真的吗?但只针对无参数构造函数?请每个问题问一个问题。