动态绑定
Scala 中属性和方法都是动态绑定,而 Java 中只有方法为动态绑定。
// 定义一个父类
class Person7() {
var name: String = _
var age: Int = _
println("1. 父类的主构造器调用")
def this(name: String, age: Int){
this()
println("2. 父类的辅助构造器调用")
this.name = name
this.age = age
}
def printInfo(): Unit = {
println(s"Person: $name $age")
}
//可以多态
def printInfo(person7: Person7): Unit = {
println("Person: " + person7.printInfo())
}
}
// 定义子类
class Student7(name: String, age: Int) extends Person7(name, age) {
var stdNo: String = _
println("3. 子类的主构造器调用")
def this(name: String, age: Int, stdNo: String){
this(name, age)
println("4. 子类的辅助构造器调用")
this.stdNo = stdNo
}
override def printInfo(): Unit = {
println(s"Student: $name $age $stdNo")
}
}
class Teacher extends Person7 {
override def printInfo(): Unit = {
println(s"Teacher")
}
}
调用
val person = new Person7()
val student = new Student7("abc", 11)
val teacher = new Teacher()
println("=======================")
person.printInfo(student)
/**
输出
1. 父类的主构造器调用
2. 父类的辅助构造器调用
3. 子类的主构造器调用
1. 父类的主构造器调用
=======================
Student: abc 11 null
Person: ()
*/
动态绑定
val person = new Student7("abc", 11)
println("=======================")
person.printInfo()
println(person.name)
/**
1. 父类的主构造器调用
2. 父类的辅助构造器调用
3. 子类的主构造器调用
=======================
Student: abc 11 null
*/