我对空构造函数的目的感到困惑,让我说清楚:
如果我有班级..
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实例,那么分配了多少个整数内存位置?
太混乱......
答案 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];
}
上的oracle文档页面
您不必为您的班级提供任何构造函数,但在执行此操作时必须小心。编译器自动为没有构造函数的任何类提供无参数的默认构造函数。此默认构造函数将调用超类的无参数构造函数。在这种情况下,如果超类没有无参数构造函数,编译器会抱怨,因此您必须验证它是否存在。如果你的类没有显式的超类,那么它有一个隐式的超类Object,它有一个无参数的构造函数
如果我然后实例化5个Test实例,那么分配了多少个整数内存位置?
JVM将为静态变量分配1个整数的空间(int y,即类或静态变量)
JVM将为int x的每个Test实例分配1个整数的空间,这是实例变量
JVM将为int a []数组的每个Test实例分配3个整数的空间,这是实例变量
总计:5 + 5 + 15(= 25)整数的空格