在 Scala 的面向对象世界里,特质(trait) 是代码复用与多继承的“魔法钥匙”——它既不像 Java 接口那样“只定义不实现”,也不像抽象类那样“继承规则死板”,而是以更灵活的方式,让“功能模块”像积木般拼接,让代码在复用与扩展中游刃有余。
一、特质是什么?
特质(trait)是 Scala 中用于实现代码复用和多继承的核心语法结构,类似 Java 8+ 的接口(但功能更强大)。可以把它理解为:一组可以被多个类共享的属性和方法集合,类通过「混入(with)」特质来获得这些能力。
二、特质的核心语法:抽象与具体成员
特质中的成员(属性 / 方法)分为「抽象」和「具体」两类,区分规则非常简单:
- 具体成员:有初始值(属性带
=赋值)或有方法体(方法带{}实现) - 抽象成员:无初始值(属性仅声明类型)或无方法体(方法仅声明签名),必须由混入的类实现
实例:定义两个独立特质
我们通过两个特质模拟「漂亮眼睛」和「高挑身材」两种能力,包含不同类型的成员:
package level02
/* 特质
* trait: 实现多继承(混入多个特质)
* 具体属性和抽象属性 怎么区分?
* 有具体值的(带 = 赋值),就是具体属性;无具体值(只声明类型),就是抽象属性
*/
object class15 {
// 独立特质1:包含具体属性、抽象属性、抽象方法
trait BeautifulEye {
val beautifulGuy = "超级漂亮" // 具体属性(带 =)
val name: String // 抽象属性(无 =,只声明类型)
def jump(): Unit // 抽象方法(无方法体,必须由子类实现)
}
// 独立特质2:包含具体属性、具体方法
trait Tall {
val height: String = "太高" // 具体属性
var weight: Int = 0 // 具体属性(var 可变)
def run(): Unit = { // 具体方法(有方法体)
println("run...")
}
}
// 子类:混入两个独立特质,实现抽象属性和抽象方法
class Child extends BeautifulEye with Tall {
override val name: String = "小记"
override def jump(): Unit = {
println(s"$name, jump...")
}
}
// 主方法(程序入口)
def main(args: Array[String]): Unit = {
val child = new Child()
println(child.name)
println(child.height)
println(child.beautifulGuy)
child.run()
child.jump()
}
}
- 完结撒花 !!!!!!!!!!
- 制作不易 希望·一键三连 在此感谢关注的粉丝宝宝
- 新来的宝宝可以关注下主播哟!!!!!