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

Java 以下代码中调用了哪个构造函数,java,memory,constructor,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 }

我对空构造函数的用途感到困惑,让我来说明一下:

如果我有课

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?
如果我有一个main方法和代码,请执行以下操作:

Test t1 = new Test();
调用哪个构造函数?或者空构造函数是否被实例化[]的构造函数覆盖

如果我然后实例化5个测试实例,分配了多少个整数内存位置


所以很困惑….

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

当一个子类覆盖它时,则调用的是新类。这非常有意义,因为当您费心重写一个方法时,您希望能够使用它而不是默认方法

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

如果您没有为类定义任何构造函数,编译器将自动向类定义中添加一个默认的无参数构造函数,以便可以使用new关键字创建对象。如果您自己显式地定义了一个无参数构造函数(您已经这样做了),那么编译器将不会添加任何内容

所以在这行代码中

Test t1 = new Test();
将调用显式定义的构造函数

回答第二个问题-类的每个实例化都会导致内存分配,这些内存需要保存一个包含3个整数的数组。对于5个实例,它将变成5倍

i、 e.
5*3*内存被一个整数占用

调用哪个构造函数?或者空构造函数是否被实例化[]的构造函数覆盖

因为您已经为测试类提供了构造函数,所以将调用您的构造函数如果要显式调用超类构造函数,请将代码更改为

 public Test() {
     super();
      a = new int[3];
 }
从上的oracle文档页

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


如果我然后实例化5个测试实例,分配了多少个整数内存位置

  • JVM将为静态变量(inty,是类或静态变量)分配1个整数的空间

  • JVM将为int x的每个测试实例分配1个整数的空间,int x是实例变量

  • JVM将为int a[]数组(实例变量)的每个测试实例分配3个整数的空间


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

    这看起来像是在做作业。我会在一个问题上仔细阅读《邮政规则》。同时也要确保你自己做研究和搜索网络,以避免类似的反应。你是对的,默认情况下会有一个默认构造函数,即没有参数的构造函数。如果您自己编写的构造函数也不接受任何参数,则这将覆盖默认构造函数。只有在未明确定义构造函数的情况下,空构造函数才会存在。澄清一下:只有在您没有任何构造函数的情况下,默认构造函数才由编译器创建。任何构造函数,即使是带有参数的构造函数,都会抑制默认构造函数。谢谢你为我澄清了这一点。我没有意识到默认值被无参数方法抑制。非常感谢Dale.Claverine所以你是说,即使我调用构造函数并初始化三个数组(变量a),系统仍然为另外两个int x和static int y分配内存?对不起,我忽略了static int y。静态属性是一个类变量,也就是说,它对所有实例都是相同的。因此,在调用构造函数时,会为x和a分配空间。无论创建多少实例,y的空间在类中只分配一次。是的,当您实例化5个实例时,系统为每个实例分配4个整数(对于x和a)加上1个整数(对于y)(由所有实例共享)。总共是21个整数,谢谢@即使构造函数没有提到int x(只有'a'被初始化)。。。每个实例的x值中包含的内容;它是空的吗?