Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.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_Constructor_Jvm - Fatal编程技术网

java中默认构造函数的实际用途是什么?

java中默认构造函数的实际用途是什么?,java,constructor,jvm,Java,Constructor,Jvm,我在许多资料和书籍中读到,在创建对象时,构造函数用于初始化字段。我还读到JVM提供了一个默认构造函数(如果我没有提到的话)。如果不需要初始化我在下面提到的字段,那么构造函数的用途是什么 我也知道,作为一个函数,需要一个没有参数的构造函数 在对象创建过程中,如果未传递参数,则必须执行此操作 (当存在带有参数的程序员定义的构造函数时) JVM是否需要提供实际上不需要的构造函数 public class test { int a; public test() {

我在许多资料和书籍中读到,在创建对象时,构造函数用于初始化字段。我还读到JVM提供了一个默认构造函数(如果我没有提到的话)。如果不需要初始化我在下面提到的字段,那么构造函数的用途是什么

我也知道,作为一个函数,需要一个没有参数的构造函数 在对象创建过程中,如果未传递参数,则必须执行此操作 (当存在带有参数的程序员定义的构造函数时)

JVM是否需要提供实际上不需要的构造函数

 public class test {
        int a;
        public test() { 
       //this constructor is useless

    }
public static void main(String[] args)
{ 
  test ob= new test();
  System.out.println(ob.a); 
//this prints 0 which means a constructor is not required in intialising `a`
}
}
如果程序员定义了像
test()
这样的构造函数,那么它是有意义的,因为可能还有其他构造函数接受参数。 但是,当程序员没有声明构造函数时,为什么JVM必须提供构造函数呢

我已经测试并证明初始化字段不需要构造函数


默认构造函数是什么样的?

构造函数(默认和自定义构造函数)不仅用于初始化对象的字段,而且还用于初始化对象本身,即使它根本没有字段。JVM调用构造函数时,会为此对象分配内存并创建其引用。

构造函数(默认和自定义构造函数)不仅用于初始化对象的字段,而且还用于初始化对象本身,即使它根本没有字段。调用构造函数时,JVM会为此对象分配内存并创建其引用。

如果您没有提供默认构造函数,JVM会添加默认构造函数的原因在于继承。例如,假设您有3个类(A、B和C),其中B扩展A,C扩展B。现在,当您实例化C时,它将调用C的构造函数以及B和A的构造函数。如果这些类中的一个或多个缺少构造函数,则实例化将失败。因此,让编译器自动添加默认构造函数可以避免这样的错误。您可能不需要在构造函数中实际执行任何工作,但JVM需要实例化对象。

如果您没有提供默认构造函数,JVM添加默认构造函数的原因是继承。例如,假设您有3个类(A、B和C),其中B扩展A,C扩展B。现在,当您实例化C时,它将调用C的构造函数以及B和A的构造函数。如果这些类中的一个或多个缺少构造函数,则实例化将失败。因此,让编译器自动添加默认构造函数可以避免这样的错误。您可能不需要在构造函数中实际执行任何工作,但JVM需要实例化对象。

在这里创建对象new test(),
此处圆括号表示对象测试的默认构造函数。创建对象后,如果未提供任何构造函数,则默认构造函数由jvm构造。因此,在构造对象后,首先调用默认构造函数。

在此处创建对象新测试(),
此处括号表示对象测试的默认构造函数。创建对象后,如果您没有给任何构造函数,那么默认构造函数是由jvm构造的。因此,在构造对象之后,第一个调用将转到默认构造函数。

问题是,虽然您知道默认构造函数在本例中没有做任何事,将来,即使您没有意识到构造函数可能会执行某些操作,并且您可能无法在可靠使用代码的任何地方重新编译。因此,最安全、最简单的方法就是总是调用一个将来可能会改变的构造函数,如果它实际上什么都不做,那么让JIT优化构造函数


不管您是否提供构造函数,字节码总是调用构造函数。当您编译使用默认构造函数的代码时,它不能假定构造函数没有做任何有用的事情,因为您可以在以后向它添加一些东西来做一些有用的事情。e、 g

说你变了

public class Test {
    int a;

    // public Test() { //this constructor does nothing
}

公共类测试{
INTA;
最终列表字符串=新的ArrayList();
//public Test(){//此构造函数现在执行某些操作。
}

公共类服务器测试{
最终列表字符串=新的ArrayList();
}
公共类测试扩展了SuperTest{
INTA;
//默认构造函数必须调用super();
}

构造函数现在初始化了
strings
字段。您可以更改该类,而无需在使用它的任何地方重新编译,并说,“嘿,我的构造函数现在做了一些有用的事情,您应该现在调用它。”

问题是,虽然您知道默认构造函数在本例中不做任何事情,但在将来,该构造函数或者可能会做一些事情,即使您没有意识到这一点,并且您可能无法在可靠使用代码的任何地方重新编译。因此,最安全、最简单的方法是始终调用将来可能会更改的构造函数,并让JIT优化构造函数(如果它实际上没有做任何事情)


不管你是否提供构造函数,字节码总是调用构造函数。当你编译使用默认构造函数的代码时,它不能假定构造函数没有做任何有用的事情,因为你可以在以后添加一些东西来做一些有用的事情

说你变了

public class Test {
    int a;

    // public Test() { //this constructor does nothing
}

公共类测试{
INTA;
最终列表字符串=新的ArrayList();
//public Test(){//此构造函数现在执行某些操作。
}

公共类服务器测试{
最终列表字符串=新的ArrayList();
}
公共类测试扩展了SuperTest{
INTA;
//默认构造函数必须调用super();
}
构造函数现在初始化了
strings
字段。您可以更改该类,而无需在使用该类的任何地方重新编译,并说:“嘿,我的con!”
public class ServerTest {
    final List<String> strings = new ArrayList<>();
}

public class Test extends SuperTest {
   int a;
   // the default constructor has to call super();
}
public Test() {
    super();
}