包
一.包嵌套
( 1)一個(gè)源文件中可以聲明多個(gè) package
( 2)子包中的類可以直接訪問父包中的內(nèi)容,而無需導(dǎo)包
( 3)包對象:在 Scala 中可以為每個(gè)包定義一個(gè)同名的包對象粘茄, 定義在包對象中的成員签舞, 作為其對
應(yīng)包下所有 class 和 object 的共享變量, 可以被直接訪問柒瓣。
( 4)導(dǎo)包說明
類
(1)scala里的setget: @BeanPropetry
class Person {
var name: String = "bobo" //定義屬性
var age: Int = _ // _表示給屬性一個(gè)默認(rèn)值
//Bean 屬性( @BeanProperty)
@BeanProperty var sex: String = "男"
//val 修飾的屬性不能賦默認(rèn)值儒搭,必須顯示指定
}
封裝
一.概念
Scala 中的 public 屬性,底層實(shí)際為 private芙贫,并通過 get 方法( obj.field())和 set 方法
( obj.field_=(value))對其進(jìn)行操作搂鲫。所以 Scala 并不推薦將屬性設(shè)為 private,再為其設(shè)置
public 的 get 和 set 方法的做法磺平。但由于很多 Java 框架都利用反射調(diào)用 getXXX 和 setXXX 方
法魂仍,有時(shí)候?yàn)榱撕瓦@些框架兼容,也會(huì)為 Scala 的屬性設(shè)置 getXXX 和 setXXX 方法(通過
@BeanProperty 注解實(shí)現(xiàn))
二.訪問權(quán)限
( 1) Scala 中屬性和方法的默認(rèn)訪問權(quán)限為 public拣挪,但 Scala 中無 public 關(guān)鍵字擦酌。
( 2) private 為私有權(quán)限,只在類的內(nèi)部和伴生對象中可用菠劝。
( 3) protected 為受保護(hù)權(quán)限赊舶, Scala 中受保護(hù)權(quán)限比 Java 中更嚴(yán)格,同類赶诊、子類可以
訪問笼平,同包無法訪問。
( 4) private[包名]增加包訪問權(quán)限舔痪,包名下的其他類也可以使用
對象
1.自動(dòng)推導(dǎo)變量類型不能多態(tài)出吹,所以多態(tài)需要顯示聲明(?)
2.構(gòu)造器:Scala包括主構(gòu)造器和輔助構(gòu)造器。
注:輔助構(gòu)造器不能直接構(gòu)建對象辙喂,必須直接或間接調(diào)用主構(gòu)造方法捶牢。
3.構(gòu)造器里的三種參數(shù)設(shè)置
class Test(name:String,var age:Int,val sex:String) {
/*
* name:局部變量
* age:成員變量
* sex:只讀成員變量
* */
var name1:String = name
}
繼承和多態(tài)
1.scala中屬性和方法都是動(dòng)態(tài)綁定
class a{
val name:String = "a"
def hello(): Unit = {
println("hello a")
}
}
class aSon extends a{
override val name:String = "aSon"
override def hello(): Unit = println("hello b")
}
object Test{
def main(args: Array[String]): Unit = {
var aa = new aSon
println(aa.name)
aa.hello()
}
}
輸出是:aSon 鸠珠,hello b。如果是java秋麸,輸出是a渐排,hello b
抽象類
1.重寫非抽象方法需要用 override 修飾,重寫抽象方法則可以不加 override
2.子類中調(diào)用父類的方法使用 super 關(guān)鍵字
3.子類對抽象屬性進(jìn)行實(shí)現(xiàn)灸蟆,父類抽象屬性可以用 var 修飾驯耻;子類對非抽象屬性重寫,父類非抽象屬性只支持 val 類型炒考,而不支持 var可缚。
因?yàn)?var 修飾的為可變變量,子類繼承之后就可以直接使用斋枢,沒有必要重寫(但是寫var不會(huì)報(bào)錯(cuò))
匿名子類
//Person是抽象類
val person = new Person {
override val name: String = "teacher"
override def hello(): Unit = println("hello teacher")
單例對象(伴生對象)
Scala語言是完全面向?qū)ο蟮恼Z言帘靡, 所以并沒有靜態(tài)的操作( 即在Scala中沒有靜態(tài)的概
念) 。但是為了能夠和Java語言交互(因?yàn)镴ava中有靜態(tài)概念)瓤帚,就產(chǎn)生了一種特殊的對象
來模擬類對象描姚, 該對象為單例對象。若單例對象名與類名一致戈次,則稱該單例對象這個(gè)類的伴
生對象轩勘,這個(gè)類的所有“靜態(tài)” 內(nèi)容都可以放置在它的伴生對象中聲明。
說明
( 1)單例對象采用 object 關(guān)鍵字聲明
( 2)單例對象對應(yīng)的類稱之為伴生類怯邪,伴生對象的名稱應(yīng)該和伴生類名一致绊寻。
( 3)單例對象中的屬性和方法都可以通過伴生對象名(類名)直接調(diào)用訪問。
**apply方法**
( 1)通過伴生對象的 apply 方法悬秉, 實(shí)現(xiàn)不使用 new 方法創(chuàng)建對象澄步。
( 2)如果想讓主構(gòu)造器變成私有的,可以在()之前加上 private搂捧。
( 3) apply 方法可以重載驮俗。
( 4) Scala 中 obj(arg)的語句實(shí)際是在調(diào)用該對象的 apply 方法,即 obj.apply(arg)允跑。用
以統(tǒng)一面向?qū)ο缶幊毯秃瘮?shù)式編程的風(fēng)格王凑。
( 5)當(dāng)使用 new 關(guān)鍵字構(gòu)建對象時(shí),調(diào)用的其實(shí)是類的構(gòu)造方法聋丝,當(dāng)直接使用類名構(gòu)
建對象時(shí)索烹,調(diào)用的其實(shí)時(shí)伴生對象的 apply 方法。
特質(zhì)(接口)
基礎(chǔ)
1.所有的 Java 接口都可以當(dāng)做 Scala 特質(zhì)使用
2.動(dòng)態(tài)混入:可靈活的擴(kuò)展類的功能
val t2 = new Teacher with SexTrait {
override var sex: String = "男"
}
println(t2.sex)
特質(zhì)疊加
第一種弱睦,一個(gè)類( Sub)混入的兩個(gè) trait( TraitA百姓, TraitB)中具有相同的具體方法,且兩個(gè) trait 之間沒有任何關(guān)系况木,解決這類沖突問題垒拢,直接在類( Sub)中重寫沖突方法
第二種旬迹,一個(gè)類( Sub)混入的兩個(gè) trait( TraitA, TraitB)中具有相同的具體方法求类,且兩個(gè) trait 繼承自相同的 trait( TraitC)奔垦,及所謂的“鉆石問題”,解決這類沖突問題尸疆, Scala采用了特質(zhì)疊加的策略椿猎。
注:特質(zhì)疊加順序
特質(zhì)自身類型
使用_:Name(with Name)=>或this:Name(with Name)=> 將Name類/接口/特質(zhì)注入
class User(val name: String, val age: Int)
class Dao {
def insert(user: User) = {
println("insert into database :" + user.name)
}
}
trait APP {
_: Dao =>
def login(user: User): Unit = {
println("login :" + user.name)
insert(user)
}
}
object MyApp extends Dao with APP{
def main(args: Array[String]): Unit = {
login(new User("bobo", 11))
}
}
特質(zhì)和抽象類的區(qū)別
1.優(yōu)先使用特質(zhì)。一個(gè)類擴(kuò)展多個(gè)特質(zhì)是很方便的寿弱,但卻只能擴(kuò)展一個(gè)抽象類犯眠。
2.如果你需要構(gòu)造函數(shù)參數(shù),使用抽象類症革。因?yàn)槌橄箢惪梢远x帶參數(shù)的構(gòu)造函數(shù)筐咧,
而特質(zhì)不行( 有無參構(gòu)造)
**類型檢查和轉(zhuǎn)換
( 1) obj.isInstanceOf[T]:判斷 obj 是不是 T 類型。
( 2) obj.asInstanceOf[T]:將 obj 強(qiáng)轉(zhuǎn)成 T 類型地沮。
( 3) classOf 獲取對象的類名嗜浮。
val pClass: Class[Person] = classOf[Person]
枚舉類和應(yīng)用類
// 枚舉類
object Color extends Enumeration {
val RED = Value(1, "red")
val YELLOW = Value(2, "yellow")
val BLUE = Value(3, "blue")
}
// 應(yīng)用類
object test extends App {
//不用main方法就能執(zhí)行
println(Color.RED)
}
type定義類型
就是給原有類型換個(gè)名
type S = String
var v:S = "aa"
//true
println(v.isInstanceOf[String])
var v1:String = "aa"
//true
println(v1.isInstanceOf[S])