哪个构造函数被调用下面的代码
我很困惑,空构造的目的,让我ellaborate:哪个构造函数被调用下面的代码
,如果我有一个类..
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实例,分配了多少个整数内存位置?
的sooo困惑....
空构造从Object类,这是在Java中所有类的超类继承。它只是分配对象的内存,但不会初始化任何内容。 因此,即使没有明确定义public A()
,对于每个对象都可以调用new A()
。 有时你不需要在构造函数中做额外的工作,所以你可以使用默认的工具而不用重新实现它。
当一个子类覆盖它时,那么被调用的是新的。它非常有意义,因为当你重写一个方法时,你希望能够使用它而不是默认的方法。
在您的示例中,Test
类包含2个整数和一个由3个整数组成的数组。 每次您实例化一个新的Test
时,都会为两个整数和三个整数的数组分配空间。这就是为什么这些被称为实例变量:它意味着它们属于一个实例。所以每个实例都有它自己的。
Claverine所以你说,即使我调用构造函数并初始化三个变量(变量a)的数组,系统仍然为另外两个int x和static int y分配内存? – BadMan
对不起,我忽略了静态int y。静态属性是一个类变量,对所有实例来说都是一样的。所以当调用构造函数时,空间被分配给x和a。无论您创建了多少实例,y的空间只能在该类中分配一次。所以是的,当你实例化5个实例时,系统为每个实例(对于x和a)分配4个整数,对y分配1个整数(由所有实例共享)。这是总共21个整数。 –
谢谢你! @ T.Claverine即使构造函数没有提及int x(只有'a'被初始化),这也是如此......每个实例的x值中都包含着什么;它是空的吗? – BadMan
如果您没有为您的类定义任何构造函数,那么编译器会自动为您的类定义添加一个默认的无参数构造函数,以便可以使用新的关键字创建对象。如果你自己显式地定义了一个无参数的构造函数(你已经完成了这个),那么编译器不会从他那边添加任何东西。因此,在这行代码
Test t1 = new Test();
你已经明确定义构造函数
将被调用。
要回答你的第二个问题 - 你的类的每个实例都会导致需要分配内存的内存容纳3个整数。对于5个实例,它只会变成5次。
即5 * 3 * memory occupied by one integer
哪个构造被称为?或者是由实例化[]的那个覆盖的空构造函数?
既然你已经提供了Test类的构造函数,你的构造函数将被调用。如果你想调用父类的构造函数明确,改变你的代码
public Test() {
super();
a = new int[3];
}
从Oracle文档页面上constructors
你不必为你的类提供任何构造函数,但这样做时你必须小心。编译器自动为任何没有构造函数的类提供一个无参数的默认构造函数。这个默认构造函数将调用超类的无参构造函数。在这种情况下,如果超类没有无参数构造函数,编译器会发出抱怨,因此您必须验证它是否存在。如果你的类没有明确的超类,那么它有对象的隐式父类,其中确实有一个无参数的构造
如果我然后实例化测试,整数存储多少位置的5个实例分配?
JVM将1个整数为静态变量(INT Y,其是类或静态变量)
JVM将分配空间1点的整数为每个测试实例对于int X分配空间,这是实例变量
- 3点的整数为每个测试实例
JVM将分配空间INT一个[]数组,这是实例变量
总计:空间为5 + 5 + 15(= 25)整数
这看起来像你在做功课。我会阅读帖子的规则一个问题。另外请确保你自己也做研究和搜索网络,以避免这样的反应。 – Dale
你是对的,默认情况下会有一个默认的构造函数,即没有参数的构造函数。如果你编写自己的构造函数,也没有参数,那么这将覆盖默认的构造函数。 –
只有在没有明确定义的情况下才会存在空的构造函数。 – shmosel