版权声明:版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/qq_42246689/article/details/85131999
3、Scala 继承
3.1、扩展类
在 Scala 中扩展类的方式和 Java 一样都是使用 extends 关键字
1、Scala 中,让子类继承父类,与 Java 一样,也是使用 extends 关键字
2、继承就代表,子类可以从父类继承父类的 field 和 method;然后子类可以在自己内部放 入父类所没有,子类特有的 field 和 method;使用继承可以有效复用代码
3、子类可以覆盖父类的 field 和 method;但是如果父类用 final 修饰,field 和 method 用 final 修饰,则该类是无法被继承的,field 和 method 是无法被覆盖的
package com.mazh.scala.day2.oop
/**
* 作者: 李涛 https://blog.csdn.net/qq_42246689
* 描述: 继承 测试
*/
object ExtendsDemo{
def main(args: Array[String]): Unit = {
val student=new Student ("黄渤",33,"1024")
println(student.studentNo)
}
}
//Person 类
class Person (name:String,age:Int){
println("Person : "+ name + "\t" + age)
}
//Student继承 Person 类
class Student(name:String,age:Int,var studentNo:String) extends Person(name,age){
println("Student : "+ name + "\t" + age + "\t" + studentNo)
}
3.2、重写方法(Override 和 Super)
1、Scala 中,如果子类要重写一个父类中的非抽象方法,则必须使用 override 关键字
2、override 关键字可以帮助我们尽早地发现代码里的错误,比如:override 修饰的父类方法 的方法名我们拼写错了;比如要覆盖的父类方法的参数我们写错了;等等
3、此外,在子类覆盖父类方法之后,如果我们在子类中就是要调用父类的被覆盖的方法呢? 那就可以使用 super 关键字,显式地指定要调用父类的方法
object OverrideDemo {
def main(args: Array[String]): Unit = {
val student = new Student222
student.eat()
}
}
abstract class Person222{
def eat()
}
class Student222 extends Person222{
// 因为父类是抽象类,所以 override可以加可以不加
override def eat(): Unit = {
println("我要吃成金三胖")
}
}
3.3、类型检查和转换
类型检查测试代码:
object TypeCheckDemo {
def main(args: Array[String]): Unit = {
val p = new Student_11()
val p1 = new People_11()
println(p.isInstanceOf[Student_11])
println(p1.isInstanceOf[Student_11])
println(classOf[Student_11])
println(p.asInstanceOf[Student_11])
}
}
class People_11{
}
class Student_11 extends People_11{
}
3.4、超类的构造
object ClazzDemo {
def main(args: Array[String]) {
val h = new Human
println(h.fight)
}
}
trait Flyable{
def fly(): Unit ={
println("I can fly")
}
def fight(): String
}
abstract class Animal1 {
def run(): Int
val name: String
}
class Human extends Animal1 with Flyable{
val name = "abc"
// 五个变量分别都赋值一次,那么 {} 也就相当于要执行五次
val t1,t2,(a, b, c),t3,t4 = {
println("ABC")
(1,2,3)
}
println(a)
println(t1._1)
println(t1.hashCode() + "\t" + t2.hashCode())
// 在 Scala中重写一个非抽象方法必须用 override修饰
def fight(): String = { "fight with 棒子"
}
// 在子类中重写超类的抽象方法时,不需要使用 override关键字,写了也可以
def run(): Int = {
1
}
}