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

在Java中使用另一个构造函数,java,constructor,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; th

考虑:

    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;
    }
第一个问题:

我得到一个错误,说“b应该是静态的”。为什么不能用这种方式使用b的默认值(3)

第二个问题:

在第一个构造函数中,如果使用注释outed部分,则不会出现错误。这是可以接受的用法吗

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

向另一个构造函数提供
b
的默认值的正确方法是
this(a,3)。在
此(…)
之后才能引用实例变量。这只是语言的规则之一

第二个问题:在第一个构造函数中,如果使用注释outed部分,则不会出现错误。这是可以接受的用法吗


新类名(a,b)做了一些不同的事情。它创建类的一个单独实例。依我拙见,这可能不是最好的办法。人们期望
new
创建一个类的实例,而在构造函数中使用
new ClassName
会创建两个实例。

在显式构造函数调用中使用实例变量是被

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

禁止使用当前实例解释了为什么显式构造函数调用语句被视为在静态上下文中出现(§8.1.3)

您引用了实例变量
b
。编译器没有在
a
上引发此错误,因为它是一个局部变量,它会隐藏实例变量
a

“静态上下文”可能是IDE建议将
b
设置为静态的原因,以便可以引用它。这是有道理的;对象的
ClassName
部分尚未构造。将
b
的用法替换为其他用法,例如
static
常量或literal
int


为了回答您的另一个问题,键入
新类名(a,b)
并不是一个错误,因为此时已经构造了这个实例,并且您正在创建一个单独的、不相关的
类名对象。

在类中使用变量时,注意作用域的有效性在哪里很重要。您已经在这里实例化了变量的新a、b变体。你在欺骗自己,让自己相信这些都是相同的变量。实际上他们在另一个地址空间。如果你想使用你的类变量,你必须把参数带到函数中。然后它们将与您所在的类同步,而不是将参数a、b隔离到您的函数范围内,

您正在构造一个对象。您不能使用尚未构造的对象的字段,因此b应该是静态的(您使用的是类中定义的b)。使用b static,b将不再依赖于特定实例。其次,使用新的类名(a,b),您将在构造函数中创建同一类的新实例。这是合法的,但它不能代替(a,b);这是另一回事。我对在
ClassName
构造函数中创建额外的
ClassName
对象非常谨慎。有关详细信息,请参见Paul Boddington的答案。您显式调用一个函数来调用另一个函数。这完全没有道理。最小化您的代码,它有助于在任何平台上运行fasteron。@brso05我指的是PB回答中的一位,他说“人们期望new创建一个类的一个实例,而在构造函数中使用new ClassName创建两个。”,关于问题2。@DavidPulse虽然这个例子不实用,但这项技术有实际应用。。。