为什么辅助构造函数必须调用Scala中的主构造函数?

为什么辅助构造函数必须调用Scala中的主构造函数?,scala,Scala,。。。并提供所有必要的参数,即使辅助构造函数不需要这些参数。(来源:)Java中的情况并非如此。这背后的原因是什么?很简单:如果不需要参数,请不要将其添加到主构造函数中 在java中,所有构造函数也执行类主体中的代码: public class Foo { String x = mkX(); public Foo() { System.out.println("THIS"); } public static String mkX() { System.out.println("

。。。并提供所有必要的参数,即使辅助构造函数不需要这些参数。(来源:)Java中的情况并非如此。这背后的原因是什么?

很简单:如果不需要参数,请不要将其添加到主构造函数中

在java中,所有构造函数也执行类主体中的代码:

public class Foo {
   String x = mkX();
   public Foo() { System.out.println("THIS"); }
   public static String mkX() { System.out.println("THAT"); return "";}
}

new Foo(); // prints THAT, then THIS

scala中的要求实际上更加宽松:主构造函数允许有参数。

简单:如果不需要参数,不要将其添加到主构造函数中

在java中,所有构造函数也执行类主体中的代码:

public class Foo {
   String x = mkX();
   public Foo() { System.out.println("THIS"); }
   public static String mkX() { System.out.println("THAT"); return "";}
}

new Foo(); // prints THAT, then THIS

scala中的要求实际上更宽松:主构造函数允许有参数。

在scala中,主构造函数的参数在类中的任何位置都可用(除其他原因外,因此您不必重复Java的
this.x=x;this.y=y;this.z=z;
)。如果参数未被使用,它首先没有理由成为一个参数,所以只考虑使用它的情况。因此,如果您可以避免提供这些参数,然后到达使用它们的地方,会发生什么


编译器可以使用默认值(
null
/
0
/
false
/etc),这很可能不是用户想要的。或者抛出一个异常,将编译错误转换为运行时错误,这与我们想要的相反。

在Scala中,主构造函数的参数在类中的任何位置都可用(除其他原因外,因此您不必重复Java的
this.x=x;this.y=y;this.z=z;
)。如果参数未被使用,它首先没有理由成为一个参数,所以只考虑使用它的情况。因此,如果您可以避免提供这些参数,然后到达使用它们的地方,会发生什么


编译器可以使用默认值(
null
/
0
/
false
/etc),这很可能不是用户想要的。或者抛出一个异常,将编译错误转换为运行时错误,这与我们想要的相反。

“在java中,所有构造函数都调用this()。”这不是真的。所有构造函数都隐式调用
super()
,除非它们显式调用另一个构造函数,但是
this()
只有在您显式编写
this()
@sepp2k时才会被调用。您是对的,我说错了。更新了答案“在java中,所有构造函数都调用this()”,这不是真的。所有构造函数都隐式调用
super()
,除非它们显式调用另一个构造函数,但是
this()
只有在您显式编写
this()
@sepp2k时才会被调用。您是对的,我说错了。更新了答案,说对了