scala面向對象
-
1、類的定義
- class 類名{
//變量
val …
var …
//定義方法
def 方法名(參數) : 返回類型 = {函數體}
}
- class 類名{
-
2、getter和setter
- 對於類中有var聲明的變量(var name:String),scala編譯器會直接自動生成其getter和setter方法;val(val name:String)聲明的變量,只聲明getter方法;無聲明的參數爲局部變量(name:String),無getter無setter,只能在類內部訪問。
- 例
class Counter(var name1:String,val name2:String,name3:String){
private name4:String = _ //也無getter和setter
//自定義個getter和setter
def name3 = name3 //getter
def name3_=(newName:String){newName}
}
-
3、構造器
- 主構造器 class Counter(var name:String)
- 輔構造器 class Counter(var name:String){
//輔助構造器有關鍵詞this實現,作用是用於實現實例時可以使用不同的參數
def this(name:String,age:Int){
this(name) //必須得先調用之前的某個構造器
this.age = age
}
def this(){
this(“add”) //調用主構造器
或者 this(“aaa”,12) //調用之前的輔構造器
}
}- 說明
- 所有構造器的參數個數和參數類型必須不一致,因爲這樣在實例化的時候才能唯一識別到某個構造器
- 輔構造器在第一行都必須直接或間接(調用其他輔構造器)調用主構造器
- 輔構造器的調用過程:假設實例化 val c = new Counter(),則輔構造器this()被調用,this()被調用的過程中會先執行this(“add”)(之後又會去調用主構造器),生成一個具有name屬性的實例,因此this()沒有新增屬性,所以到此就結束了。如果是 val c = new Counter(“mike”,12),則輔構造器this(name:String,age:Int)會被調用(之後又會去調用主構造器),在這個過程 中會先執行this(name),生成一個具有name屬性的實例,然後再將給該實例添加age屬性。
-
4、單例對象(包括伴生對象和孤立對象)
- 類似靜態對象,無需實例化即可去調用其內部不的方法
object person{def hahaha(){println(“hahahahahha”)}}
person.hahaha()即可調用 - 伴生對象
class A{} 伴生類
object A{} 伴生對象
伴生類和伴生對象可互相調用內部成員 - 孤立對象
只有 object A{}
- 類似靜態對象,無需實例化即可去調用其內部不的方法
-
5、apply方法
-
實例化後,給該實例傳入apply方法的參數,apply方法會被自動調用
class person{
def apply(s:String){ println(“hahahahhahaha”)
}
val p = new person
p(“123”) 則apply方法會被調用如果apply方法是在object中,object中的方法無需實例化也可被調用,調用更加簡便。
class person{
def apply(s:String){ println(“hahahahhahaha”)
}
person(“123”) apply方法即被調用val arr = new Array[Int](5) 此爲正常調用
val arr = Array(1,2,3) 此爲調用Array的apply方法 -
工廠
class Car(name:String){def info() {println(“aaaaaa”)}
object Car { def apply(name:String) = new Car(name) }
val mycar = Car(“TESLA”) //直接調用伴生對象的apply,無需new
-
-
6、update方法
- 用於修改對象的某個值
- 當對帶有括號幷包括一到若干參數的對象進行賦值時,編譯器將調用對象的update方法,並將括號裏的參數和等號右邊的值一起作爲update方法的輸入參數來執行調用
- val arr = Array(1,2,3)
arr(0) = 123 //調用了update方法 arr.update(0,123),這也是Array的索引用的是() ,這是函數式編程的特點。
-
7、upapply方法
- apply的反向操作,給定一個對象,返回對象的屬性值
def unapply(c:Car):Option[(String,Int)]={Some((c.brand,c.price))}
- apply的反向操作,給定一個對象,返回對象的屬性值
-
8、abstract抽象類
- 抽象:字段沒有給初始值、方法沒給定義
abstract class Car{
val name:String //沒有給初始值
def printInfo() / 沒有給函數定義
} - 抽象類的作用:用於程序的設計階段
- 抽象:字段沒有給初始值、方法沒給定義
-
9、extends繼承(只能繼承一個類)
- 重寫父類方法或字段(var)用 override修飾(父類爲抽象時可以不加)
-
10、case class
- 自動生成apply方法、unapply方法
-
11、Option類
-
12、trait特質
- 給類提供組件?
- scala只能繼承一個超類,可混入多個特質
- trait Flyable {
var maxFlyHeight:Int
def fly()
def breathe() {println(“huhuhuhuhu”)
}
trait HasLegs{
val legs:Int
def move() {println(“moveeeeee”)}
}
class Animal(val category:String){
def info(){println("This is a " + category)}
}
class Bird(category:String,flyHeight:Int) extends Animal(category) with Flyable with HasLegs{
var maxFlyHeight = flyHeight
val legs = 2 //重載特質的抽象字段
def fly(){ println(“I can fly”)} //重載特質的抽象方法
}