1.29
val字段可以通过block或expression赋值,例:
class Person {}
class Person(val name:String, var age:Int) { // primary constructor
private profile: String = ""
def this(name:String) = this(name, age)
def this() = {
this("no one", 0)
this.profile = "faceless"
}
}
class Person private {} // private parameterless primary constructor
class Person private (name: String){} // private one-parameter primary constructor
class Person (name:String){
...
println(s"name: $name") // executed when constructing
... // members
}
val字段值可以是lazy计算的,通过lazy关键字实现,其中的值计算要推迟到第一次访问,而非类实例化时就计算。lazy val text=io.Source.fromFile("read.large.size.file").getLines.mkString
constructor分两种,primary constructor和auxiliary constructor,后者通过在类中定义名为this的函数实现。定义private的primary constructor通过在类名和参数括号之间加private关键字实现class ClassName private (...)
。
实例化class使用new ClassName(....)语法。
内嵌类 nested class
类中可定义别的类,但其类型绑定于类实例(而非类),也就说对于两个外部类的实例,其关联的内部类(内嵌类)的类型是不一样的。但是这仅限于scala编译器角度,由于编译为jvm字节码时等同于java(非静态)内嵌类,故运行时的类型实际一样,而且对于java视角而言其类型等同于类的嵌套类。如果定义为外部类的内嵌类,又想表达与外部类实例无关(所有外部类实例)的类型语义,可通过#
操作符实现,形式为<外部类>#<内部类>。对于仅想将类名作为名字空间使用而定义类情况,通过在伴生对象中定义内部类实现,相当于java中的静态内部类。