Class scala重写类参数

Class scala重写类参数,class,scala,parameters,overriding,Class,Scala,Parameters,Overriding,这个话题以前已经讨论过,但(我认为)没有得到令人满意的回答。 考虑下面的Scala代码: class A(A:Int){val\u A=A} 类A1(val a:Int){val_a=a} 类B(a:Int)扩展了a(a)//OK 类C(val a:Int)扩展了a(a)//OK 类B1(a:Int)扩展了A1(a)//OK 类C1(val a:Int)扩展了A1(a)//失败 类D1(覆盖值a:Int)扩展了A1(a)//确定 我认为将类参数声明为val只会对构造函数调用产生影响: 复制参数

这个话题以前已经讨论过,但(我认为)没有得到令人满意的回答。 考虑下面的Scala代码:

class A(A:Int){val\u A=A}
类A1(val a:Int){val_a=a}
类B(a:Int)扩展了a(a)//OK
类C(val a:Int)扩展了a(a)//OK
类B1(a:Int)扩展了A1(a)//OK
类C1(val a:Int)扩展了A1(a)//失败
类D1(覆盖值a:Int)扩展了A1(a)//确定
我认为将类参数声明为val只会对构造函数调用产生影响: 复制参数而不是传递引用。但是,在每种情况下,类字段都被分配为val。这是否正确

现在我不明白的是为什么我们需要最后一行的override关键字。 请注意,我们没有将类声明为case类,因此不会自动分配字段

最后,有没有一个很好的理由可以解释为什么我们甚至想用val定义一个像A1这样的类 类参数

提前感谢所有回复

我认为,将类参数声明为val只具有 对构造函数调用的影响:复制参数而不是 传递推荐信。但是,在每种情况下,都会分配类字段 作为val,这是正确的吗

一点也不

如果构造函数中存在val或var,则会导致在类中声明同名的val或var,并在构造时为其分配构造函数参数。否则,如果构造函数参数在初始化外部(即在方法中)使用,则仍然可以在类中创建(私有)val

在A1类中,成员a实际上是无用的,因为如果你写

class A1(val a: Int) {} 
相当于

class A1(someFreshName: Int) {val a = someFreshName}
因此,在
C1
中,您试图声明一个新成员a,而该成员a已经存在。因此,覆盖。 在您的特定实例中,两个成员都具有相同的值,但您可以这样做(可能不是一个好主意)


然后,新成员
a
将构造函数参数作为值,先前的
a
将具有值12并被隐藏(但是,在
A1
中编写的代码仍将访问它)

为什么我在
class A1(val a:Any){def test=a}中得到
m:m
;类C1(override val a:Any)扩展了A1(12){override def toString=s“$a:$test”};println(新C1(“m”))
?什么是
A1将访问它
class C1(override val a: Int) extends A1(12)