前面我们学习了Scala中类的相关知识,主要是一个类和一个对象,接下来一段时间,我们将学习多个类之间的关系。今天先来看两个类之间的继承关系。
(一)继承的概念和基本语法
-
定义:在原有类的基础上定义一个新类,原有类称为父类,新类称为子类。
-
class 子类名 extends 父类名 { 类体 }
-
好处:复用代码和实现多态。复用代码:子类可以继承父类的特性。多态 : 子类可以在自己内部实现父类没有的特性。
eg1:
package level02
import java.io.FileWriter
object basss124 {
object cl
/*
*继承
* extends
* 好处:不劳而获
*
*/
class Animal() {
def eating():Unit ={
println("Animal eating")
}
}
//Dog继承了 Animal
class Dog extends Animal (){
}
def main(args: Array[String]): Unit = {
val dog1 =new Dog()
dog1.eating()//直接可以使用父类的方法
}
}
当子类从父类继承的方法不能满足需要时,子类需要有自己的行为,怎么办?此时使用使用 override 可以重写父类的方法
(二) override
格式:override def 方法名(参数可选) { }
eg2:
package level02
import java.io.FileWriter
object basss124 {
object cl
/*
*继承
* extends
* 好处:不劳而获
*
* 问题:
* 如果子类觉得父类的方法并不是自己想要的,如何定义自己的方法呢?
* 1.override重写
* 2.super 在子类内部,通过super 来访问父类
*/
class Animal() {
def run():Unit={
}
def eating():Unit ={
println("Animal eating")
}
}
//Dog继承了 Animal
class Dog extends Animal (){
//在子类中重写(覆盖)父类的方法
override def eating():Unit ={
//调用父类的方法?
//在子类内部,通过super 来访问父类
super.eating()
println("我是狗,我有自己的吃饭方式!!")
}
}
def main(args: Array[String]): Unit = {
val dog1 =new Dog()
dog1.eating()//调用自己的吃饭方法!
}
}
(三)继承与多态
- 面向对象的三个特点:_封装 继承 多态 。
- 同一操作作用于不同的对象, 可以有不同的解释,产生不同的执行结果,这就是多态性。
eg3:
package level02
object basss125 {
/*
*面向对象的编程语言有三大特性: 封装,继承,多态
*多态:同一个操作,作用于不同的对象,有不同的执行结果。
*/
class Animal() {
def eating():Unit ={
println("Animal eating")
}
}
//Dog继承了 Animal
class Dog extends Animal (){
override def eating():Unit ={
super.eating()
println("我是狗,我要大口大口的嚼!!")
}
}
//cat继承了 Animal
class Cat extends Animal (){
override def eating():Unit ={
super.eating()
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)
}
}
当我们实例化子类的对象时,是否需要调用父类的构造器? 是否需要调用子类的构造器?
(四) 处理构造器的调用顺序
代码验证调用顺序:父类的主构造器->子类主构造器->子类的辅助构造器
eg4:
package level02
object basss126 {
/*
*存在继承关系的时候,构造器的调用顺序
* 父类构造器 -》 子类构造器
*/
class Animal() {
println("父类构造器被调用....")
}
//Dog继承了 Animal
class Dog extends Animal (){
println("子类构造器被调用....")
}
//Puppy 继承了Dog
class Puppy extends Dog(){
println("子类:Puppy 构造器被调用....")
}
def main(args: Array[String]): Unit = {
new Puppy();//new会自动调用构造器去生成对象
}
}
- 完结撒花 !!!!!!!!!!
- 制作不易 希望·一键三连 在此感谢关注的粉丝宝宝
- 新来的宝宝可以关注下主播哟!!!!!