本篇內(nèi)容主要講解“scala面向?qū)ο笤趺磳?shí)現(xiàn)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“scala面向?qū)ο笤趺磳?shí)現(xiàn)”吧!
公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)推出易門免費(fèi)做網(wǎng)站回饋大家。
類class
class Hello{
private val tt="Hello";
private var tos="World";
def add(){
println(tt+tos);
}
def plus(m:Char)=tos+m;
}
類定義
類主要包括字段val和var方法和函數(shù),但scala禁止使用同樣的名稱命名字段和方法
類成員可見性有兩種 private跟public,private需要申明,pulic不用申明
類申明后用new申明對(duì)象
val one=new Hello();
對(duì)象操作
val a=one.value1
val b=one.value2
one.value2=one.plus(H)
one.add()
調(diào)用無(wú)參方法可以不帶()one。add
若類中無(wú)參方法不帶() 實(shí)際調(diào)用也不帶()
def add{println(value1+value2)}
one。add
getter方法
setter方法
sclala對(duì)每個(gè)類的字段默認(rèn)都提供getter和setter方法
對(duì)于共有字段來(lái)說(shuō),getter和setter同樣是公有的對(duì)于私有字段來(lái)說(shuō),則是私有的
var申明的字段帶有g(shù)etter和setter方法
val字段自帶有g(shù)etter方法只讀
對(duì)于字段value1 期形式為value1,沒有setter方法
對(duì)于字段value2 其getter和setter方法形式為value2和value2_=
實(shí)際使用時(shí),在類定義外,getter和setter方法是使用一致的,形如one。value2
getter方法和setter方法意義在與控制類中的私有對(duì)象數(shù)據(jù)
在類中可以通過(guò)重定義getter和setter方法獲取,有限制的修改私有字段
class HELLOWORLD {
private var value1 = "HELLO"
var value2 = "WORLD"
def add() {println(value1+value2) }
def plus(m: Char) = value2 + m
def value1 = value1
def value1_=(newvalue1: String) {
if (newvalue1.length > value1.length) value1 = newvalue1
}
}
class H
構(gòu)造器
每個(gè)類都有一個(gè)主構(gòu)造器,且與類定義交織在一起
主構(gòu)造器的參數(shù)直接放置在類名之后
class HELLOWORLD(val value1:String,var value2:String)
主構(gòu)造器的參數(shù)被編譯成一個(gè)字段,并在構(gòu)造對(duì)象初始化時(shí)傳入
一個(gè)類若沒有顯示定義朱構(gòu)造器那么自動(dòng)擁有一個(gè)無(wú)參主構(gòu)造器
若類中有直接執(zhí)行的語(yǔ)句,,每次函數(shù)構(gòu)造時(shí)都會(huì)執(zhí)行一次,不論怎么樣的構(gòu)造器
如 class HELLOWORLD(val value1:String,var value2:String){
println(“HELLOWORLD IS CREATED ”
val value3=value1+value2)}
主構(gòu)造器一般有四種
value:String
生成對(duì)象私有字段,對(duì)象中沒有方法使用value,則沒有該字段
private val/var value:String
私有字段 私有的gettter和setter方法
val、var value :String
私有字段,共有的setter、getter方法
@BeanProperty val、var value :String
class HelloWorld private (主構(gòu)造器){類成員}
主構(gòu)造器私有,只能通過(guò)輔助構(gòu)造器構(gòu)造對(duì)象
輔助構(gòu)造器
scala 類有任意多的輔助構(gòu)造器
輔助構(gòu)造器的名稱為this 在類中定義
輔助構(gòu)造器必須以一個(gè)朱構(gòu)造器或者其他已定義的輔助構(gòu)造器調(diào)用開始
class HELLOWORLD {
private var value1 = "HELLO"
var value2 = "WORLD"
def this(m:String){
this()//調(diào)用主構(gòu)造器
this.value1=m
}
def this(m:String,n:String){
this(m)
this.value2=n
}
}
嵌套類
scala允許任何語(yǔ)法結(jié)構(gòu)中鑲嵌語(yǔ)法結(jié)構(gòu),因此能夠在類中定義類
class HELLOWORLD{
CLASS HI{}}
對(duì)于容一個(gè)外部類ongoing實(shí)例下的內(nèi)部類是不同的,
形如 val three=new HELLOWORLD與four =new HELLOWORLD
three.HI與four.HI是不同的類
內(nèi)部類可以調(diào)用外部類成員,利用外部類.this或者指針實(shí)現(xiàn)
class HELLOWORLD{pointto=>
var value2=""
class HI{val value3=HELLOWORLD.this.value2
var value4=pointto.value2}}}}}
scala對(duì)象
單例對(duì)象
object語(yǔ)法定義了某個(gè)類的單個(gè)實(shí)例
對(duì)象的構(gòu)造器在該對(duì)象第一次被使用時(shí)調(diào)用
object語(yǔ)法結(jié)構(gòu)與class大致相同,除了object不能提供構(gòu)造器參數(shù)
通常使用單列對(duì)象的環(huán)境
作為存放工具函數(shù)或者常量的地方
共享單個(gè)不可變的是咧
利用單個(gè)實(shí)例協(xié)調(diào)某個(gè)服務(wù)
伴生對(duì)象
當(dāng)一個(gè)單列對(duì)象存在同名類的時(shí)候,稱為伴生對(duì)象
class HELLOWORLD{}
object HELLOWORLD{}
類和其伴生對(duì)象可以互相訪問(wèn)私有屬性,但必須存在同一源文件中
類的伴生對(duì)象可以被訪問(wèn),但并不在作用于中
class HELLOWORLD{}
object HELLOWORLD{def }
HELLOWORLD必須通過(guò)HELLOWORLD.NOW調(diào)用伴生對(duì)象中的NOW 方法,而不能直接用NOW來(lái)調(diào)用
擴(kuò)展類對(duì)象
構(gòu)造一個(gè)擴(kuò)展了指定類和特質(zhì)的類作為類的對(duì)象,同時(shí)擁有對(duì)象定義給出的所有特性
apply方法
需要構(gòu)造有參數(shù)需求的伴生對(duì)象時(shí),可定義并使用appl方法
class HELLOWORLD(var m:String,n:Char){}
object HELLOWORLD{
def apply(n:Char)=new HELLOWORLD("",n)
}
val hi=HELLOWORLD('j')
擴(kuò)展
extens是scala 中實(shí)現(xiàn)繼承的保留字
class week extends month{}
week 類繼承了month類所有的非私有成員
week類是month類的子類,month類是week類的超類
子類能重寫超類成員(具有相同名稱和參數(shù))
class week(val num:int) extends month(var no:int){}
object day extends week{}
單例對(duì)象同樣能從類中繼承,與類的繼承語(yǔ)法相同
重寫
scala中使用override保留字方法進(jìn)行方法重寫
class week (override val lastday:string)extends month{}
override 保留字實(shí)際使用類似private 申明這個(gè)保留字后的定義申明是對(duì)超類的重寫,因此,其也可能寫在類定義的參數(shù)中
class week extends month(override val lastday:string){}
子類重寫或者修改sclala會(huì)檢查其超類,但是超類的修改并不會(huì)檢查子類
class month{def secondday(m:String)={}}
class week extends month{def secondday={}}
重寫規(guī)則
重寫def
用val 利用val能重寫超類用沒有參數(shù)的方法
用def子類的方法與超類方法重名
用var同時(shí)重寫getter和setter方法。只重寫getter方法報(bào)錯(cuò)
重寫val
用val 子類一個(gè)私有字段與超類字段重名,getter方法重寫超類的getter方法
重寫var
用var 且當(dāng)超類的var是抽象的才能被重寫,否者超類的var會(huì)被集成
class month{
val one=25//可在子類用val重寫
var two=15//不可在子類中用var重寫,因?yàn)椴皇浅橄蟮?br/> var three:int
def firstday= 、、可在子類中用val重寫
def now= //可在子類中用var重寫
def now_=可在子類中用def重寫
def lastday(m:char)={}
}
子類中def 只能重寫超類的def, val能重寫超類的val或不帶參數(shù)的def,var只能重寫超類中
抽象的var或者超類的getter和setter
}
抽象
不能被實(shí)例的類叫做抽象類
抽象類的某個(gè)或者某幾個(gè)成員沒有被完整的定義,這些沒有被完整定義的成員稱為抽象方法或者抽象字段
用abstract保留字段標(biāo)記抽象類
abstract year{
val name:Array[string]//抽象的val帶有一個(gè)抽象的getter方法
var num:Int//抽象的var 帶有抽象的getter和setter方法
def sign //沒有方法體函數(shù)體,是一個(gè)抽象方法
}
只要類中有一個(gè)抽象成員,必須使用abstract標(biāo)記
重寫抽象方法,抽象字段不許愿使用override保留字
保護(hù)
當(dāng)一個(gè)類不希望被繼承,拓展時(shí),可在類申明前加上final保留字
final class year{}
當(dāng)一個(gè)類某些成員不希望被重寫時(shí),可在成員申明前加上final保留字
class year{final def sign{}}
當(dāng)超類中某些成員需要被子類繼承,又不想對(duì)子類以外可見時(shí),在成員變量時(shí)加上protect保留字
protect【this】將訪問(wèn)權(quán)限定于當(dāng)前對(duì)象,類似于private[this]
類中protected的成員對(duì)其子類可見,對(duì)其超類不可見
class year{protect def sign{}}
構(gòu)造
子類構(gòu)造器的運(yùn)行在超類構(gòu)造器運(yùn)行之后
在超類的構(gòu)造器其中調(diào)用的成員被子類重寫之后,返回值可能不正確
class month{
val num=31
val days=new Array[Int](num)}
class week extends month{
override val num=7}
構(gòu)造week對(duì)象前先執(zhí)行month構(gòu)造器 num被初始化為31 month為初始化數(shù)組
調(diào)用num 但num被子類week重寫了,但因?yàn)閣eek構(gòu)造器還沒有被調(diào)用num的值未被初始化因而返回
0 day 被設(shè)置長(zhǎng)度為0的數(shù)組,month構(gòu)造器運(yùn)行完畢,執(zhí)行week構(gòu)造器,num被初始化為7
解決方法
將超類的val 申明為final
將超類的val申明為lazy
在子類中使用提前定義的語(yǔ)法
提前定義在超類的構(gòu)造器運(yùn)行之前初始化子類的字段
把需要提前定義的語(yǔ)句塊放在extends與超類之間,并后接with保留字
class week extends {overide val num=7} with month{}
提前定義中若需要調(diào)用b成員時(shí),除非b成員在已經(jīng)調(diào)用前提定義
class week extends{
override val num=7
override val num2=num+1//允許 num已經(jīng)被提前定義
overide val num4=num2+num3 //不允許,num3沒有在之前提前定義
}with month{}
scala特質(zhì)
多重繼承
scala不支持多重繼承,取而代之的是特質(zhì)
一個(gè)子類只能擁有一個(gè)超類,一個(gè)超類能擁有多個(gè)子類
冀class week extends month,year不合法
為什么
若一個(gè)子類繼承自不同的超類 不同的超類中同名成員子類不知如何處理
多重繼承產(chǎn)生菱形繼承問(wèn)題
解決多重繼承可能導(dǎo)致的問(wèn)題消耗的資源遠(yuǎn)比多重繼承產(chǎn)生的價(jià)值高
sclala使用特質(zhì)達(dá)到類似多重繼承的效果
一個(gè)類可以擴(kuò)展多個(gè)特質(zhì),一個(gè)特質(zhì)可以被多個(gè)類擴(kuò)展
特質(zhì)使用
特質(zhì)是scala里代碼復(fù)用的基礎(chǔ)單元,封裝了方法和字段定義
特質(zhì)使用保留字trait 具體語(yǔ)法與類定義相似,除了不能擁有構(gòu)造器
trait reset{
def reset (m:Int,n:Int)=if(m>n)1}
一旦特質(zhì)被定義了,就可以混入類種
class week extends reset wiTH B WITH C{}
特質(zhì)中成員能是抽象的嗎
所有java接口都能當(dāng)做是特質(zhì)使用在scala中
特質(zhì)成員可以是抽象的,而且,不需要使用abstract申明
同樣的,重寫特質(zhì)的抽象方法無(wú)需給出override
但是,多個(gè)特質(zhì)重寫一個(gè)特質(zhì)的抽象方法需要override
除了在類中定義混入特質(zhì)外還可以
trait reseting extends reset{}
在構(gòu)造時(shí)混入特質(zhì)
val five=new month with reseting
特質(zhì)構(gòu)造
特質(zhì)構(gòu)造是有順序的,從左至右被構(gòu)造
構(gòu)造器如下順序構(gòu)造
object hi {
def main(args:Array[String]):Unit={}
trait one{//抽象特質(zhì)
def a()}
trait two extends one{
override def a(){println("my")}
a
}
trait tree extends one {
override def a(){println("Name")}
a
}
class Name(){val m=1}
val one=new Name() with two with three //NAME NAME
println()
val two=new Name() with three with two//MY MY
}
如果class A extends B1 with B2 with B3
那么傳戒B1,B2 班去掉重復(fù)且右側(cè)勝出
到此,相信大家對(duì)“scala面向?qū)ο笤趺磳?shí)現(xiàn)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!