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