构造函数在java中重载

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)

我不明白这个错误.有人能解释一下这里到底发生了什么吗?

Roh*_*ain 5

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

现在,当您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)

  • @ chathura2020.你的所有课程至少扩展一个班级.所以,你不能说,你的班级没有延伸任何其他班级.如果它没有显式地执行它,`Object`类隐式地是超类. (3认同)