Scala:调用超类构造函数
我在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
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
。