一.继承
//父类
class Person(name:String,age:Int) {
println("Person ...")
def walk():Unit = println("walk like a normal person")
}
//子类
//继承关系
class Student(name:String,age:Int,var stuNo:String) extends Person(name,age){
println("Student ...")
override def walk():Unit={
super.walk();//调用父类的walk方法
println("walk like a elegant swan")
}
}
object demo{
def main(args: Array[String]): Unit = {
//先执行父类构造再执行子类构造
val student = new Student("Tom",18,"10002")
//方法重写
student.walk()
}
}
二.抽象类
//抽象类
abstract class Person(name:String,age:Int) {
def walk():Unit
}
object demo{
def main(args: Array[String]): Unit = {
//匿名内部类
val p = new Person("Tom",18){
override def walk() = {
println("person object ...")
}
}
p.walk()
}
}
三.多态
多态也叫"动态绑定",指"在执行期间判断所引用对象的实际类型,根据其实际类型调用其相应的方法"。
abstract class Person(var name:String,var age:Int) {
def walk():Unit
//talkTo方法参数为Person类型
def talkTo(p:Person):Unit
}
class Student(name:String,age:Int) extends Person(name,age){
private var stuNo:Int = 0
def walk() = println("walk like a elegant swan")
//重写
def talkTo(p:Person) = {
println("talkTo() method in Student")
println(this.name + " is talking to " + p.name)
}
}
class Teacher(name:String,age:Int) extends Person(name,age){
private var teaNo:Int = 0
def walk() = println("walk like a elegant swan")
//重写
def talkTo(p:Person) = {
println("talkTo() method in Teacher")
println(this.name + " is talking to " + p.name)
}
}
object demo{
def main(args: Array[String]): Unit = {
val p1 = new Student("Tom",18)
val p2 = new Teacher("Jack",34)
p1.talkTo(p2)
p2.talkTo(p1)
}
}