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中的静态内部类。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统