Scala:调用超类构造函数

Scala:调用超类构造函数,scala,Scala,我在Scala处理超类构造函数时遇到了一种奇怪的行为 我用以下方式定义了一个非常简单的类 package server class Content(identifier:String,content:String){ def getIdentifier() : String = {identifier} def getContent() : String = {content} } 和一个简单的子类 package server class SubCont

我在Scala处理超类构造函数时遇到了一种奇怪的行为

我用以下方式定义了一个非常简单的类

package server

class Content(identifier:String,content:String){
    def getIdentifier() : String    = {identifier}
    def getContent()    : String    = {content}
}
和一个简单的子类

package server

class SubContent(identifier:String, content:String) extends Content(identifier, content+"XXX")){

    override def getContent():String = {
        println(content)
        super.getContent
    }
}
真正奇怪的是,在子类中存在超类属性的副本,因此如果我创建一个新对象

var c = new SubContent("x","x")
执行

c.getContent
首先打印出“x”(提供给子类构造函数的值),但返回“xXXX”(提供给超类构造函数的值)


有没有办法避免这种行为?基本上,我想要的是子类不创建自己的属性,而只是将参数传递给超类。

它正按照您的要求执行。在将第二个构造函数参数传递给超类构造函数时,您增加了它,然后使用超类“
getContent
来提供从子类“
getContent
返回的值

您需要注意的是,构造函数参数(那些与属性无关的参数,因为它们是
case类的一部分,或者因为它们是用
val
关键字声明的)在整个类体中都有作用域。类的构造函数是其主体中任何方法之外的部分。因此,方法体中对构造函数参数的引用强制将构造函数参数存储在字段中,以便它具有必要的范围。请注意,在本例中,
getContent
中的
println
调用导致了这样一个隐藏的构造函数参数字段


回复注释“是否有其他方法来定义它以避免出现这种情况?或者至少,如果我从未引用子类构造函数的参数,将分配它们的字段(浪费内存)?”

如果对普通构造函数参数(*)的唯一引用在构造函数本身中(即,在任何方法体之外,并且
val
var
初始值设定项不符合方法体的条件),则不会创建任何不可见字段来保存构造函数参数

然而,如果有更多的你试图“避免”比这些无形的领域,我不明白你在问什么


(*)我所说的“普通构造函数参数”是指那些不属于case类且不带有
val
关键字的参数。

这不是case类,但问题仍然存在——特别是因为
content
在子类的主体中被使用。是否有其他方法来定义它以避免这种情况?或者至少,如果我从不引用子类构造函数的参数,它们的字段将被分配(浪费内存)?使用
super.content
而不是
subcent.getContent
中的
content