scala继承
1.擴展類
class Fu {var name: String = _var age: Int = _def func() = {println("fu func....")} }//scala擴展類的方式與java一樣,使用extends關鍵字 class Zi extends Fu {//在定義中給出子類需要而超類沒有的字段和方法,也可以重寫超類的方法override def func(): Unit = {println("zi func ---")}def ziFun() = {println("zi other func ....")}} final class Fu { //final修飾的類不能被擴展var name: String = _var age: Int = _def func() = {println("fu func....")} } class Fu { var name: String = _var age: Int = _final def func() = { //final修飾的方法,不能被重寫println("fu func....")} }?
2.重寫方法
class Fu {var name: String = _var age: Int = _def func1() = {println("fu func1....")}def func2() = {println("fu func2....")}} //scala重寫一個非抽象方法,必須使用override修飾符 class Zi extends Fu {override def func1() = {println("zi func ....")}//調用超類方法,使用super關鍵字super.func2() }?
3.類型檢查和轉換
class Fu {var name: String = _var age: Int = _def func1() = {println("fu func1....")}}class Zi extends Fu {}object Zi extends App {//測試對象是否是給定類 isInstanceOf//測試成功使用asInstanceOf將引用轉換為子類的引用val p = new Ziif (p.isInstanceOf[Fu]) {val z: Fu = p.asInstanceOf[Fu] //轉為父類型/*p執行Fu類或者其子類,則p.isInstanceOf[Fu]為truep為null,p.isInstanceOf[Fu]為false, p.asInstanceOf[Fu]為nullp不是一個Fu,p.asInstanceOf[Fu]拋出異常*///測試p指向的是Fu,而不是子類,if (p.getClass == classOf[Fu]) {}//類型檢查和轉換,使用模式匹配更好 p match {case s: Fu => println("fu")case _ => println("not fu")}} }4.超類的構造
/* scala中,類有一個主構造器和任意多輔助構造器 每個輔助構造器必須以先前定義的輔助構造器或者主構造器調用開始 輔助構造器永遠不可能直接調用超類的構造器 子類的輔助構造器最終都會調用主構造器,只有主構造器才能調用超類的構造器*/class Fu(name: String, age: Int) {}class Zi(name: String, age: Int, val salary: Double) extends Fu(name, age) {//相當于子類將name age傳遞給父類 }object Zi extends App {}?
5.重寫字段
class Fu(val name: String) {override def toString: String = getClass.getName + " name= " + name }class Zi(codename: String) extends Fu(codename) {override val name = "abc"override val toString: String = "abc" }object Zi extends App {val p = new Zi("zhangsan")println(p.toString) } /* def只能重寫另外一個def val只能重寫另一個val或者不帶參數的def var只能重寫另一個抽象的var*/?
6.抽象類
//某個或某幾個方法沒有被完整定義 abstract class Person(val name: String) {def id: Int //沒有方法體 抽象方法 }class Student(name:String) extends Person(name){def id: Int = name.hashCode //不需要override }?
7.抽象字段
//某個或某幾個方法沒有被完整定義 abstract class Person {val id: Int //沒有初始化 帶有抽象getter方法的抽象字段var name: String //抽象字段 帶有抽象的getter setter方法 }class Student(name: String) extends Person {override val id: Int = _override var name: String = _ }?
8.構造順序和提前定義
class Creature {val range: Int = 10val env: Array[Int] = new Array[Int](range)}class Ant1 extends Creature {override val range: Int = 2}class Ant2 extends { //提前定義:超類的執行器執行之前,初始化子類的val字段override val range: Int = 2 //Ant2的數組為長度為2的數組 } with Creature9.對象相等性
class Person {}object Person extends App {/*AnyRef的eq方法 檢查兩個引用是否指向同一對象equals方法調用eq*/val p1 = new Personval p2 = new Personval p3 = p1println(p1.eq(p2)) // falseprintln(p1.equals(p2)) //falseprintln(p1.eq(p3)) //true println(p1==p2) //falseprintln(p1==p3) //true } class Person(val name: String, val age: Int) {override def equals(obj: scala.Any): Boolean = {val that = obj.asInstanceOf[Person]if (that == null) {false} else {this.name == that.name && this.age == that.age}}override def hashCode(): Int = super.hashCode() }object Person extends App {/*AnyRef的eq方法 檢查兩個引用是否指向同一對象equals方法調用eq*/val p1 = new Person("zhangsan",10)val p2 = new Person("zhangsan",10)println(p1.equals(p2)) // trueprintln(p1==p2) //true 做完null檢查后調用equals方法 }
?
轉載于:https://www.cnblogs.com/yin-fei/p/10831547.html
總結