继承
extends
好处:不劳而获
如何解决子类觉得父类的方法不是自己要的?
1.override 重写
2.super 在子类内部,通过super来访问父类
案例
class Animal() {
def eating():Unit={
println("Animal eating")
}
}
class Dog extends Animal(){ // Dog 继承了 Animal
//覆盖 → 解决子类觉得父类的方法不是自己要的
override def eating():Unit ={
println("小狗有自己的吃饭方式") // 在子类中重写(覆盖)父类的方法
}
}
def main(args:Array[String]):Unit ={
val dog1 = new Dog()
dog1.eating() // 直接可以使用父类的方法
}
多态
多态:同一个操作,作用于不同的对象,有不同的执行结果
案例
class Animal() {
def eating():Unit={
println("Animal eating")
}
}
class Dog extends Animal(){ // Dog 继承了 Animal
//覆盖 → 解决子类觉得父类的方法不是自己要的
override def eating():Unit ={
println("小狗有自己的吃饭方式") // 在子类中重写(覆盖)父类的方法
}
}
//Cat 继承了Animal
class Cat extends Animal(){ // Dog 继承了 Animal
//覆盖 → 解决子类觉得父类的方法不是自己要的
override def eating():Unit ={
println("小猫有自己的吃饭方式") // 在子类中重写(覆盖)父类的方法
}
}
// 测试函数
// 他的函数是 父类
def test(animal: Animal): Unit = {
animal.eating()
}
def main(args:Array[String]):Unit ={
val cat = new Cat()
val dog = new Dog()
// ↓ 传入子类的对象
test(cat)
test(dog)
}
构造器
存在继承关系的时候,构造器的调用顺序: 父类构造器 → 子类构造器
案例
class Animal() {
println("父类构造器被调用......")
}
class Dog extends Animal(){ // Dog 继承了 Animal
println("子类构造器被调用.....")
}
// puppy 继承了 DOG
class Puppy extends Dog(){
println("子类:Puppy 构造器被调用......")
}
def main(args:Array[String]):Unit ={
new Puppy()
}