cha*_*ura 4 java constructor constructor-overloading
我收到以下代码片段的错误
错误是:在调用超类型构造函数之前无法引用x(并指出注释1中的语句)
class Con{
int x =10;
Con(){
this(++x); //1
System.out.println("x :"+x);
}
Con(int i){
x=i++;
System.out.println("x :"+x);
}
}
Run Code Online (Sandbox Code Playgroud)
在主要方法中,我有这个说法
Con c1=new Con();
Run Code Online (Sandbox Code Playgroud)
我不明白这个错误.有人能解释一下这里到底发生了什么吗?
在创建类的实例时,构造函数首先调用它的超类构造函数来初始化超类字段.一旦所有超类构造函数都运行,那么只有当前构造函数继续初始化它自己的字段.
现在,当您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);
}
Run Code Online (Sandbox Code Playgroud)
即使通过super()电话也是如此.因此,下面的代码也会给你相同的错误(考虑Con使用参数化构造函数扩展另一个类):
Con() {
super(++x); //1
System.out.println("x :"+x);
}
Run Code Online (Sandbox Code Playgroud)