1.父类子类的概念
以代码为例
- 父类
Animal:定义了一个动物类,包含两个参数(同时作为成员变量):
val name: String:不可变属性(只读),表示动物的名字;var age: Int:可变属性(可读写),表示动物的年龄。类中包含:- 构造器:创建实例时会执行打印语句
println(s"父类构造器.....${name} ${age}"); - 方法
eat():打印动物进食的信息。
-
子类
Dog:定义了一个狗类,继承自父类Animal(通过extends关键字实现继承),新增了一个可变属性var color: String(表示狗的颜色)。子类的构造器参数为(name: String, age: Int, var color: String),其中前两个参数name和age会传递给父类的构造器(通过extends Animal(name, age)实现)。类中包含子类构造器的打印语句:println(s"子类构造器.....${name} ${age} ${color}")。 -
主方法
main:程序入口,创建Dog类的实例dog1(参数为 "旺财"、1、"黑色"),并调用继承自父类的eat()方法。
2. 核心逻辑与执行流程
- 创建子类实例时的构造器调用顺序:在 Scala 中,创建子类实例时,会先执行父类的构造器,再执行子类的构造器。下例中,
new Dog("旺财", 1, "黑色")会先调用父类Animal的构造器(传入 "旺财" 和 1),打印父类构造器.....旺财 1;然后执行子类Dog的构造器,打印子类构造器.....旺财 1 黑色。 - 继承的特性:子类
Dog继承了父类Animal的所有非私有成员(包括属性name、age和方法eat()),因此可以直接通过子类实例dog1调用eat()方法。调用dog1.eat()时,会使用父类的name和age属性,打印旺财 1 eating....。
3.下面是整体代码
// 父类: name, age
class Animal(val name:String, var age:Int) {
println(s"父类构造器.....${name} ${age}")
def eat():Unit = {
println(s"${name} ${age} eating....")
}
}
// 子类: name, age, color
class Dog(name:String, age:Int, var color:String) extends Animal(name, age) {
println(s"子类构造器.....${name} ${age} ${color}")
}
def main(args: Array[String]): Unit = {
val dog1 = new Dog("旺财", 1, "黑色")
dog1.eat()
}
总结
这段代码通过 extends 关键字实现了类的继承,体现了面向对象编程中 “子类复用父类代码” 的特性,同时展示了父子类构造器的执行顺序。子类可以继承父类的属性和方法,也可以扩展自己的属性。