在Java中使用另一个构造函数

iws*_*nmw 9 java constructor

考虑:

    int a = 0;
    int b = 3;

    //Constructor 1
    public ClassName (int a) {
        this(a, b); //Error
        //new ClassName(a, b) //No error
    }

    //Constructor 2
    public ClassName (int a, int b) {
        this.a = a;
        this.b = b;
    }
Run Code Online (Sandbox Code Playgroud)

第一个问题:

我收到一个错误,说"b应该是静态的".为什么我不能以这种方式使用b的默认值(3)?

第二个问题:

在第一个构造函数中,如果我使用注释部分,我不会收到错误.这是可以接受的吗?

rge*_*man 12

JLS,第8.8.7.1节禁止在显式构造函数调用中使用实例变量.

构造函数体中的显式构造函数调用语句可能不引用此类或任何超类中声明的任何实例变量或实例方法或内部类,或者使用thissuper在任何表达式中; 否则,发生编译时错误.

禁止使用当前实例解释了为什么显式构造函数调用语句被认为发生在静态上下文中(第8.1.3节).

您引用了实例变量b.编译器没有引发此错误,a因为它是一个局部变量,它会影响实例变量a.

"静态上下文"可能是您的IDE建议创建b静态的原因,因此可以引用它.这说得通; ClassName对象的一部分尚未构建.将该用法替换为b其他内容,例如static常量或文字int值.

要回答您的其他问题,键入new ClassName(a, b)不是错误,因为此时已构造此实例,并且您正在创建一个单独的,不相关的ClassName对象.


Pau*_*ton 6

第一个问题:我收到一个错误,说"b应该是静态的".为什么我不能以这种方式使用b的默认值(3)?

b其他构造函数提供默认值的正确方法是this(a, 3);.你不能引用实例变量,直到 this(...).这只是该语言的规则之一.

第二个问题:在第一个构造函数中,如果我使用注释部分,我不会收到错误.这是可以接受的吗?

new ClassName(a, b);有所不同.它创建了一个单独的类实例.以我的拙见,这可能不是最好的事情.人们期望new创建一个类的一个实例,而new ClassName在构造函数中使用创建两个.