java中的构造函数重载
下面的代码片段有一个错误 错误是:无法在调用超类型构造函数之前引用x(并指出注释1处的语句) 在主要方法中,我有这样的陈述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还不存在(它是在另一个构造函数实例化时创建的)。所以你还不能引用它 如果确实
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);
}