Scala 繼承與多型與trait
阿新 • • 發佈:2018-12-09
1)scala中,讓子類繼承父類,與java一樣,使用extends關鍵字 2)繼承就代表,子類可以從父類繼承父類的field和method,然後子類可以在自己內部放入父類所沒有,子類特有的filed和method,使用繼承可以複用程式碼 3)子類可以覆蓋父類的filed和method,但是要注意的是final關鍵字,代表field和method無法覆蓋 4)子類中的方法要覆蓋父類中的方法,必須寫override(參見foo) 5)子類中的屬性val要覆蓋父類中的屬性,必須寫override(參見nameVal) 6)父類中的變數不可以覆蓋(參見nameVar) 4)定義抽象類 abstract class Animal { //定義一個抽象類,用於繼承 var age :Int = 2 val weight:Double = 35 //抽象方法,沒有具體的實現 def color() //非抽象方法,有具體的實現 def eat()={ println("吃食物") } //使用了final關鍵字,表示不能重寫, override final def action():Unit = { println ("奔跑") } } /** * 如果想實現父類的方法:CTRL+I * 如果想重寫父類的方法:CTRL+O */ class Monkey extends Animal{ //重寫父類欄位 override var age:Int = 15 override val weight: Double = 15 //抽象方法,沒有實現(重寫父類抽象的方法,可以選擇性的使用override) override def color(): Unit = { println("棕色") } //非抽象方法有實現了,(重寫父類非抽象方法,必須使用override) override def eat(): Unit = { println("吃桃子") } } object Monkey{ def main(args: Array[String]): Unit = { val monkey = new Monkey println(monkey.weight) println(monkey.color()) println(monkey.eat()) println(monkey.action()) } }
(*)多型 1)什麼是多型:目的是為了讓程式碼更加,降低耦合 有繼承或實現特質(介面) 父類引用指向子類物件或介面指向實現類 方法需要重寫 abstract class Element { def demo(): Unit ={ println("Element's invoked") } } class ArrayElement extends Element{ override def demo(): Unit = { println("ArrayElement's invoked") } } class LineElement extends ArrayElement{ override def demo(): Unit = { println("LineElement's invoked") } } class UniforElement extends Element //沒有重寫父類方法 object ElementTest{ //引數型別為祖宗類,任何子類例項都可以傳遞(基類) def invokedDemo(e:Element): Unit ={ e.demo() //多型,在執行時呼叫相應子類方法 } def main(args: Array[String]): Unit = { invokedDemo(new ArrayElement) //父類引用指向子類物件 invokedDemo(new LineElement) //祖父類引用指向孫類物件 invokedDemo(new UniforElement) //沒有重寫父類方法,所以呼叫的時候輸出祖宗類demo } }
}
(*)trait:特質
1)scala 特徵:相當於Java中的介面,實際上他比介面功能強大
2)與介面不同的是:是可以定義屬性和方法的實現
3)一般情況下scala的類只能被繼承單一父類,但是如果是trait的話可以實現多個繼承,從結果上來看就是實現了多繼承
4)trait定義的方式與類類似,但是它使用的關鍵字是trait