此代码
class Foo(str: String) {
val len = str.length
def getLen = len
def getStr = str}
将编译为
public class Foo implements ScalaObject
{
private final int len;
private final String str;
public Foo(String str)
{
this.str = str;
super();
len = str.length();
}
public String getStr()
{
return str;
}
public int getLen()
{
return len();
}
public int len()
{
return len;
}
public int $tag()
throws RemoteException
{
return scala.ScalaObject.class.$tag(this);
}
}
但是这段代码
class Foo(str: String) {
val len = str.length
def getLen = len
}
将编译为
public class Foo implements ScalaObject
{
private final int len;
public Foo(String str)
{
len = str.length();
}
public int getLen()
{
return len();
}
public int len()
{
return len;
}
public int $tag()
throws RemoteException
{
return scala.ScalaObject.class.$tag(this);
}
}
为什么Foo课程中没有私人会员?
private final String str;
这是某种优化吗?
为什么允许它指向构造函数的参数。
为什么行“def getStr = str
”没有编译时错误?
答案 0 :(得分:3)
在Scala中,构造函数参数可以从类中的任何位置看到,我更像是“对象参数”。在你的第二个片段中,它没有被编译为为它创建一个类属性,因为你没有在构造函数之外引用它 - 它不是必需的。
答案 1 :(得分:1)
嗯,根据Odersky的书,构造函数是唯一可以将字段与构造函数参数匹配的地方。如果你不这样做,将不会在构造函数外看到变量。