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中的静态内部类。

posted @   秋渡晚枫  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示