【图文详细 】Scala——继承

版权声明:版权声明:本文为博主原创文章,转载请附上博文链接! 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 
  } 
} 

猜你喜欢

转载自blog.csdn.net/qq_42246689/article/details/85131999