(一) 继承的概念和基本语法
[讲] 定义:在原有类的基础上定义一个新类,原有类称为父类,新类称为子类。
class 子类名 extends 父类名 { 类体 }
[讲] 好处:复用代码和实现多态。复用代码:子类可以继承父类的特性。多态 : 子类可以在自己内部实现父类没有的特性。
package level02
object l4 {
class Aniaml(var name:String="动物") {
val age:Int=10;
def eat():Unit={
println("animal eat......")
}
def run():Unit={
println("animal run ......")
}
}
class Dog() extends Aniaml(){
}
def main(args: Array[String]): Unit = {
val d1=new Dog()
d1.run()
d1.eat()
}
}
( 二 ) 继承的好处之复用代码
那一个类继承了另一个类之后,有什么好处呢?
package level02
object l5 {
class parent() {
def run():Unit={
println("run.....")
}
}
class Son extends parent(){
def run1 ():Unit={}
override def run():Unit= {
super.run()
println("开自动驾驭的车 run......")
}
}
def main(args: Array[String]): Unit = {
val s1=new Son()
s1.run()
}
}
继承的特点:Dog就直接具备了animal的功能eating
(三)继承的方法重写
[问] 当子类从父类继承的方法不能满足需要时,子类需要有自己的行为,怎么办?此时使用使用 override 可以重写父类的方法。
[讲] 格式
package level02
object l8 {
class Animal(var name:String,var age:Int) {
println(s"父类的构造器被调用....${name},${age}")
def say():Unit={
println(s"Animal ${name},${age}")
}
}
class Dog(name:String, age:Int,var color:String) extends Animal(name, age){
println(s"子类的构造器被调用....${name},${age},${color}")
override def say():Unit={
super.say()
println(s"狗狗....,我的颜色是${color}")
}
}
def main(args:Array[String]):Unit={
val d1=new Dog("旺财",1,"黑色")
d1.say()
}
}
( 四 ) 继承与多态
[问] 面向对象的三个特点:_封装 继承 多态 。同一操作作用于不同的对象, 可以有不同的解释,产生不同的执行结果,这就是多态性。
package level02
object l5 {
class parent() {
def run():Unit={
println("run.....")
}
}
class Son extends parent(){
def run1 ():Unit={}
override def run():Unit= {
super.run()
println("开自动驾驭的车 run......")
}
}
def main(args: Array[String]): Unit = {
val s1=new Son()
s1.run()
}
}
(五)处理 构造器 的调用顺序
[问] 当我们实例化子类的对象时,是否需要调用父类的构造器? 是否需要调用子类的构造器?
package level02
object l7 {
class Father() {
println("Father的构造器....")
}
class Son extends Father(){
println("Son的构造器....")
}
def main(args: Array[String]): Unit = {
new Son()
}
}
类的继承
1.继承的定义和语法
2.代码复用
3.代码重写
4.理解多态
5.构造器的调用顺序
什么是继承?
- 实现继承要用:
extends - 实现重写要用:
override - new 一个子类的对象时,会先调用:父类的构造器,再调用:子类的构造器