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

时间:2016-02-15 13:48:14

标签: java constructor jvm

我在许多资料和书籍中读过,构造函数用于在创建对象时初始化字段。我还读过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必须提供一个呢?

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

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

7 个答案:

答案 0 :(得分:4)

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

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

说你改变了

public class Test {
    int a;

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

public class Test {
    int a;
    final List<String> strings = new ArrayList<>();

    // public Test() { //this constructor does something now.
}

public class ServerTest {
    final List<String> strings = new ArrayList<>();
}

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

构造函数现在初始化了strings字段。你可以改变这个类,而不必在任何地方重新编译它,并说,嘿,我的构造函数现在做了一些有用的东西,你现在应该调用它。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

  1. 在缺席时插入默认构造函数的是编译器,而不是JVM。
  2. 需要默认构造函数,因为需要从构造函数中调用基类的构造函数。
  3. 默认构造函数如下所示:

    public Test() {
        super();
    }
    

答案 4 :(得分:0)

在这里创建对象new test()时, 这里括号表示对象test的默认构造函数。创建对象后,如果你没有给出任何构造函数,那么默认构造函数是由jvm.so构造的,在构造你的对象之后,第一次调用将转到你的默认构造函数。

答案 5 :(得分:0)

默认构造函数是一个无参数构造函数,当您没有定义任何构造函数时,编译器会自动调用它。无论如何,您定义的构造函数也可以称为默认构造函数。 它基本上使用super()方法调用超类的构造函数。 因此,自动调用的默认构造函数将类似于:

public ClassName(){

超级();

}

答案 6 :(得分:0)

如果没有为类定义其他构造函数,Java的编译器会创建一个默认构造函数。

但为什么呢?

编译器的工作是将Subclass的构造函数链接到Super Class(最终是Object类)。编译器的工作不是为您的类提供默认构造函数,因此Java正在为您执行此操作。

要进行链接,它首先检查类中是否有任何构造函数,如果是,它会将super()添加到该构造函数。

如果类中没有构造函数,以便编译器进行正确的链接,Java会在其中添加一个默认构造函数和对super()的调用。

为什么?

因为每个类都是Object类的子类(直接或间接),所以它将继承一个对象类,为此必须完全初始化所述Object类。这是由默认构造函数完成的。