Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的构造函数重载_Java_Constructor_Constructor Overloading - Fatal编程技术网

java中的构造函数重载

java中的构造函数重载,java,constructor,constructor-overloading,Java,Constructor,Constructor Overloading,下面的代码片段有一个错误 错误是:无法在调用超类型构造函数之前引用x(并指出注释1处的语句) 在主要方法中,我有这样的陈述 Con c1=new Con(); 我不明白这个错误。有人能解释一下这里到底发生了什么吗 Con(){ this(++x); //1 System.out.println("x :"+x); } 此时此刻,Con还不存在。它首先通过调用另一个构造函数进行实例化。这意味着x还不存在(它是在另一个构造函数实例化时创建的)。所以你还不能引用它 如果确实

下面的代码片段有一个错误

错误是:无法在调用超类型构造函数之前引用x(并指出注释1处的语句)

在主要方法中,我有这样的陈述

    Con c1=new Con();
我不明白这个错误。有人能解释一下这里到底发生了什么吗

Con(){
    this(++x); //1
    System.out.println("x :"+x);
}
此时此刻,
Con
还不存在。它首先通过调用另一个构造函数进行实例化。这意味着
x
还不存在(它是在另一个构造函数实例化时创建的)。所以你还不能引用它

如果确实需要引用它,则必须使用静态变量

private static int x = 10;

创建类的实例时,构造函数首先调用它的超类构造函数来初始化超类字段。一旦所有的超类构造函数都运行了,那么只有当前的构造函数继续初始化它自己的字段

现在,当您在构造函数中添加一个
this()
调用时,它不会调用超类构造函数。这是因为,构造函数中的第一条语句要么是到超类构造函数的链(使用
super()
),要么是同一类的不同构造函数(使用
This()

因此,您不能在
this()
中传递该字段,因为该字段尚未初始化。但这真的没有道理,你为什么要做这样的事

请记住,编译器将字段初始化代码移动到类的每个构造函数中。因此,您的构造函数实际上相当于:

Con() {
    this(++x); //1

    // This is where initialization is done. You can't access x before it.
    x = 10;
    System.out.println("x :"+x);
}
即使使用
super()
调用,也是如此。因此,下面的代码也会给出相同的错误(考虑到
Con
使用参数化构造函数扩展了另一个类):


构造函数中的第一个调用只能是
this()
super()
,如果它们都不是,编译器会自动插入对super的调用,但在构造函数中,您使用this()调用了其他构造函数。基本上,每当你构造一个对象时,超类首先被初始化,然后子类的成员被初始化。所以你不能引用未初始化的成员,因为它们在超类的成员和超类本身之后被初始化。

。在调用super()之前,不能引用x。通常这是隐式的,但是由于您有一个
this
调用,
super
调用被抑制,因此消息被隐藏。我想不出一种方法来做你想做的事情,而不重新构造一点。在构造函数中调用this()有什么用?有人能解释一下吗?我可以考虑使用参数化构造函数调用this()…@boxed_uul this()的情况,该构造函数用于调用同一类中存在的重载构造函数。假设您有一个带4个参数的被调用构造函数,但对于这两个字段,已经有另一个构造函数进行初始化,在这种情况下,您需要使用这个(x,y)称你的两个论点为constructor@Algorithmist:编译器是否将
super()
添加到所有构造函数(重载/空)?如果是这样,会不会导致多个
super()
调用?@boxed\l即使OP接受答案,也应该继续学习,尽量从每个问题中获取更多信息。关于你的问题,编译器总是添加super()如果未指定任何内容,则调用。这对参数化构造函数也是有效的。如果显式调用super(),则它不会从其侧面添加super()。因为我没有扩展任何类,所以我们可以将super class构造函数称为参数化构造函数吗?@chathura2020。当您的类不扩展任何类时,您需要使用
super()
@chathura2020调用
对象
类0-arg构造函数。您的所有类至少扩展一个类。所以,你不能说,你的类没有扩展任何其他类。如果它没有显式地执行此操作,
对象
类隐式地是super class.super(++x);无法工作,因为对象类没有参数化构造函数:)。有什么办法吗answer@RohitJain:在上面的代码中,如果我们使用“static int x=10;”,那么它可以很好地编译。这意味着静态变量在调用超类构造函数之前被初始化。所以顺序如下->初始化静态变量(加载类Con),初始化超类,初始化子类。如果我错了,请纠正我。
Con() {
    this(++x); //1

    // This is where initialization is done. You can't access x before it.
    x = 10;
    System.out.println("x :"+x);
}
Con() {
    super(++x); //1
    System.out.println("x :"+x);
}