在以下代码中调用了哪个构造函数

时间:2016-05-15 23:59:18

标签: java memory constructor

我对空构造函数的目的感到困惑,让我说清楚:

如果我有班级..

public class Test {
  private int x;
  private int a[];
  private static int y;

  public Test() {
     a = new int[3];
  }
}

我知道存在一个空的默认构造函数:

public Test() {
                      //or at least I think it exists
}                     //what is its purpose?

如果我有一个主方法并编写以下代码:

Test t1 = new Test();

调用哪个构造函数?或者是实例化[]?

的空构造函数

如果我然后实例化5个Test实例,那么分配了多少个整数内存位置?

太混乱......

3 个答案:

答案 0 :(得分:0)

空构造函数继承自Object类,它是Java中所有类的超类。它只是分配对象的内存,但不会初始化任何内容。 因此,对于每个对象,即使未明确定义new A(),也可以调用public A()。 有时你不需要在构造函数中做额外的工作,所以你可以使用默认的工作,而不必费力地重新实现它。

当一个子类覆盖它时,那个被调用的是新的。它非常有意义,因为当你打扰覆盖方法时,你希望能够使用它而不是默认方法。

在您的示例中,Test类包含2个整数,以及3个整数的数组。 每次实例化一个新的Test时,都会为两个以上的整数和三个整数的数组分配空间。这就是为什么那些被称为实例变量:它意味着它们属于一个实例。所以每个实例都有自己的。

答案 1 :(得分:0)

如果没有为您的类定义任何构造函数,那么编译器将自动向类定义中添加一个默认的无参数构造函数,以便可以使用new关键字创建对象。如果你自己明确地定义了一个无参数的构造函数(你已经完成的方式),那么编译器就不会在他身边添加任何东西。

所以在这行代码中

Test t1 = new Test();

将显式定义您明确定义的构造函数。

回答你的第二个问题 - 你的类的每个实例化都会导致分配包含3个整数的数组所需的内存。对于5个实例,它将简单地变为5次。

即。 5 * 3 * memory occupied by one integer

答案 2 :(得分:0)

  

调用哪个构造函数?或者是实例化[]?

的空构造函数

由于您为Test类提供了构造函数,因此将调用您的构造函数。 如果您想明确调用超类构造函数 ,请将代码更改为

 public Test() {
     super();
      a = new int[3];
 }

来自constructors

上的oracle文档页面
  

您不必为您的班级提供任何构造函数,但在执行此操作时必须小心。编译器自动为没有构造函数的任何类提供无参数的默认构造函数。此默认构造函数将调用超类的无参数构造函数。在这种情况下,如果超类没有无参数构造函数,编译器会抱怨,因此您必须验证它是否存在。如果你的类没有显式的超类,那么它有一个隐式的超类Object,它有一个无参数的构造函数

  

如果我然后实例化5个Test实例,那么分配了多少个整数内存位置?

  1. JVM将为静态变量分配1个整数的空间(int y,即类或静态变量)

  2. JVM将为int x的每个Test实例分配1个整数的空间,这是实例变量

  3. JVM将为int a []数组的每个Test实例分配3个整数的空间,这是实例变量

  4. 总计:5 + 5 + 15(= 25)整数的空格

相关问题