Scala中的類和對象,實用樣例詳細解析!

Scala中的類和對象,實用樣例詳細解析!

Scala類
簡介
類是對象的抽象,而對象是類的具體實例。類是抽象的,不佔用內存,而對象是具體的,佔用存儲空間。類是用於創建對象的藍圖,它是一個定義包括在特定類型的對象中的方法和變量的軟件模板。
Scala中的類不聲明爲public,一個Scala源文件中可以有多個類。
Scala簡單實例
import java.io._<br/>class Point(xc: Int, yc: Int) { var x: Int = xc var y: Int = ycdef move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("x 的座標點: " + x); println ("y 的座標點: " + y); } }<br/>object Test { def main(args: Array[String]) { val pt = new Point(10, 20);// 移到一個新的位置<br/>pt.move(10, 10);<br/>} }
Scala抽象類
抽象類是一種不能被實例化的類,抽象類中包括了若干不能完整定義的方法,這些方法由子類去擴展定義自己的實現。
abstract class Animal { //抽象字段(域) //前面我們提到,一般類中定義字段的話必須初始化,而抽象類中則沒有這要求 var height:Int //抽象方法 def eat:Unit }<br/>//Person繼承Animal,對eat方法進行了實現 //通過主構造器對height參數進行了初始化 class Person(var height:Int) extends Animal{ //對父類中的方法進行實現,注意這裏面可以不加override關鍵字 def eat()={ println("eat by mouth") }<br/>}<br/>//通過擴展App創建程序的入口 //App其實是一種trait,它幫助我們定義了main方法。 object Person extends App{ new Person(10).eat() }繼承
簡介
重寫一個非抽象方法必須使用override修飾符。
重寫超類的抽象方法時,不需要使用override關鍵字。
只有主構造函數纔可以往基類的構造函數裏寫參數。
繼承會繼承父類的所有屬性和方法,Scala 只允許繼承一個父類。
Scala簡單實例
class Point(xc: Int, yc: Int) { var x: Int = xc var y: Int = ycdef move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("x 的座標點: " + x) println ("y 的座標點: " + y) } }<br/>class Location(override val xc: Int, override val yc: Int, val zc :Int) extends Point(xc, yc){ var z: Int = zcoverride def move(dx: Int, dy: Int) { x = x - dx y = y - dy println ("x 的座標點: " + x) println ("y 的座標點: " + y) }<br/>def move(dx: Int, dy: Int, dz: Int) { x = x + dx y = y + dy z = z + dz println ("x 的座標點 : " + x) println ("y 的座標點 : " + y) println ("z 的座標點 : " + z) } }<br/>object Test { def main(args: Array[String]) { val loc = new Location(10, 20, 15);// 移到一個新的位置<br/>loc.move(10, 10);<br/>loc.move(10, 10, 5);<br/>} }
Scala單例對象
簡介
在Scala中,是沒有static的,但是提供了單例模式的實現方法,那就是使用關鍵字object。
Scala中使用單例模式時,除了定義的類之外,還要定義一個同名的 object對象,它和類的區別是,object對象不能帶參數。
簡單實例
object Student { private var studentNo:Int=0; def uniqueStudentNo()={ studentNo+=1 studentNo } def main(args: Array[String]): Unit = { println(Student.uniqueStudentNo()) } }
伴生類與伴生對象
簡介
當單例對象與某個類是同一個名稱時,單例對象被稱作是這個類的伴生對象,類被稱爲是這個單例對象的伴生類。必須在同一個源文件裏定義伴生類和伴生對象。它們可以互相訪問其私有成員。
簡單實例
class Student(var name:String,var age:Int){ private var sex:Int=0 //直接訪問伴生對象的私有成員 def printCompanionObject()=println(Student.studentNo) }<br/>object Student { private var studentNo:Int=0; def uniqueStudentNo()={ studentNo+=1 studentNo } def main(args: Array[String]): Unit = { println(Student.uniqueStudentNo()) val s=new Student("john",29) //直接訪問伴生類Student中的私有成員 println(s.sex) } }匿名類
當某個類在程序中只使用一次時,可以將類定義爲匿名類。
//抽象的Person類 abstract class Person(name:String,age:Int){ def walk():Unit }<br/>object demo{ def main(args: Array[String]): Unit = { //下面的代碼定義了一個匿名類,並且進行了實例化 //直接new Person("john",18),後面跟的是類的內容 //我們知道,Person是一個抽象類,它是不能被實例化的 //這裏能夠直接new操作是因爲我們擴展了Person類,只不 //過這個類是匿名的,只能使用一次而已 val s=new Person("john",18){ override def walk()={ println("Walk like a normal Person") } } s.walk() } }
多態與動態綁定
簡介
多態(Polymorphic)也叫動態綁定(Dynamic Binding)、遲綁定(Late Binding),指在執行期間(而非編譯期間)判斷所引用對象的實際類型,根據其實際類型調用其相應的方法。子類的引用可以賦給父類。
簡單實例
//抽象Person類 abstract class Person(var name:String,var age:Int){def walk():Unit //talkTo方法,參數爲Person類型 def talkTo(p:Person):Unit }<br/>class Student(name:String,age:Int) extends Person(name,age){ private var studentNo:Int=0 def walk()=println("walk like a elegant swan") //重寫父類的talkTo方法 def talkTo(p:Person)={ println("talkTo() method in Student") println(this.name+" is talking to "+p.name) } }<br/>class Teacher(name:String,age:Int) extends Person(name,age){ private var teacherNo:Int=0def walk()=println("walk like a elegant swan")//重寫父類的talkTo方法 def talkTo(p:Person)={ println("talkTo() method in Teacher") println(this.name+" is talking to "+p.name) } }<br/>object demo{ def main(args: Array[String]): Unit = {//下面的兩行代碼演示了多態的使用<br/>//Person類的引用可以指向Person類的任何子類<br/>val p1:Person=new Teacher("albert",38)<br/>val p2:Person=new Student("john",38)<br/>//下面的兩行代碼演示了動態綁定<br/>//talkTo方法參數類型爲Person類型<br/>//p1.talkTo(p2)傳入的實際類型是Student<br/>//p2.talkTo(p1)傳入的實際類型是Teacher<br/>//程序會根據實際類型調用對應的不同子類中的talkTo()方法p1.talkTo(p2)<br/>p2.talkTo(p1)<br/>} }
文章來自:https://www.itjmd.com/news/show-3240.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章