2.4
值类 value class
值类的设计目的是使得隐式转换高效进行。
特点:
- 继承自AnyVal
- 主构函数中包含且仅包含一个val字段
- 没有其他字段或构造函数
- 自动提供equals、hashCode函数,基于比较和散列包含的唯一字段
早定义 early definition
覆盖早定义,为了解决父类初始化中能正确获取被子类覆盖的字段/方法值问题。(语法很不优雅)
class Sup{
val n = 5
val p = n+1
}
// no using early-definition
class Sub{
override val n = 10
}
// new Sub().p : 1 // Unexpected value <= not 11 ( neither 6)
// 实例构造过程:
/*
1. new Sub() => 开辟内存空间(置字段值为等价0),准备构造自己前构造父类
2. 设置父类字段n为5
3. 设置字段p的值(通过调用字段n的getter然后加1),由于n的getter被覆盖,调用子类覆盖方法,因子类在等待父类初始化完成而未开始对自身字段赋值,子类字段getter返回等价0,导致父类初始化时p为0+1即1
3. 子类的父类初始化完成后开始构造自身,置字段n为10.
*/
// early-definition
class Sub extends {override val n=10} with Sup
// new Sub().p : 11 // OK
equality 相等性
一般用==
比较,如值、集合(位置及对应元素)。
比较引用是否指向同一地址(是否为同一个实例对象)时使用方法eq
new String("a") == new String("a") // true
new String("a") eq new String("a") // false
List(1,2,3) == Vector(1,2,3) // true
要自定义相等性,需覆盖方法equals(Object)即override def equals(o:Any)
,需要注意的是,参数类型是Any,而不是自身类型(否则成了重载),也不是覆盖方法==
,即不是override def ==(o:Any)
或参数类型为自身类型的==方法。
TODO
canEqual, equals
特质 trait
- 类可以实现任意多特质
- 特质可要求实现类具备特定字段、方法、或超类
- 特质可提供方法实现和字段(状态)
- 类实现的多个特质间有层结构,特质顺序决定行为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统