您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“scala面向?qū)ο笤趺磳?shí)現(xiàn)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“scala面向?qū)ο笤趺磳?shí)現(xiàn)”吧!
類(lèi)class
class Hello{
private val tt="Hello";
private var tos="World";
def add(){
println(tt+tos);
}
def plus(m:Char)=tos+m;
}
類(lèi)定義
類(lèi)主要包括字段val和var方法和函數(shù),但scala禁止使用同樣的名稱命名字段和方法
類(lèi)成員可見(jiàn)性有兩種 private跟public,private需要申明,pulic不用申明
類(lèi)申明后用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
若類(lèi)中無(wú)參方法不帶() 實(shí)際調(diào)用也不帶()
def add{println(value1+value2)}
one。add
getter方法
setter方法
sclala對(duì)每個(gè)類(lèi)的字段默認(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,沒(méi)有setter方法
對(duì)于字段value2 其getter和setter方法形式為value2和value2_=
實(shí)際使用時(shí),在類(lèi)定義外,getter和setter方法是使用一致的,形如one。value2
getter方法和setter方法意義在與控制類(lèi)中的私有對(duì)象數(shù)據(jù)
在類(lèi)中可以通過(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è)類(lèi)都有一個(gè)主構(gòu)造器,且與類(lèi)定義交織在一起
主構(gòu)造器的參數(shù)直接放置在類(lèi)名之后
class HELLOWORLD(val value1:String,var value2:String)
主構(gòu)造器的參數(shù)被編譯成一個(gè)字段,并在構(gòu)造對(duì)象初始化時(shí)傳入
一個(gè)類(lèi)若沒(méi)有顯示定義朱構(gòu)造器那么自動(dòng)擁有一個(gè)無(wú)參主構(gòu)造器
若類(lèi)中有直接執(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ì)象中沒(méi)有方法使用value,則沒(méi)有該字段
private val/var value:String
私有字段 私有的gettter和setter方法
val、var value :String
私有字段,共有的setter、getter方法
@BeanProperty val、var value :String
class HelloWorld private (主構(gòu)造器){類(lèi)成員}
主構(gòu)造器私有,只能通過(guò)輔助構(gòu)造器構(gòu)造對(duì)象
輔助構(gòu)造器
scala 類(lèi)有任意多的輔助構(gòu)造器
輔助構(gòu)造器的名稱為this 在類(lèi)中定義
輔助構(gòu)造器必須以一個(gè)朱構(gòu)造器或者其他已定義的輔助構(gòu)造器調(diào)用開(kāi)始
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
}
}
嵌套類(lèi)
scala允許任何語(yǔ)法結(jié)構(gòu)中鑲嵌語(yǔ)法結(jié)構(gòu),因此能夠在類(lèi)中定義類(lèi)
class HELLOWORLD{
CLASS HI{}}
對(duì)于容一個(gè)外部類(lèi)ongoing實(shí)例下的內(nèi)部類(lèi)是不同的,
形如 val three=new HELLOWORLD與four =new HELLOWORLD
three.HI與four.HI是不同的類(lèi)
內(nèi)部類(lèi)可以調(diào)用外部類(lèi)成員,利用外部類(lèi).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è)類(lèi)的單個(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ì)象存在同名類(lèi)的時(shí)候,稱為伴生對(duì)象
class HELLOWORLD{}
object HELLOWORLD{}
類(lèi)和其伴生對(duì)象可以互相訪問(wèn)私有屬性,但必須存在同一源文件中
類(lèi)的伴生對(duì)象可以被訪問(wèn),但并不在作用于中
class HELLOWORLD{}
object HELLOWORLD{def }
HELLOWORLD必須通過(guò)HELLOWORLD.NOW調(diào)用伴生對(duì)象中的NOW 方法,而不能直接用NOW來(lái)調(diào)用
擴(kuò)展類(lèi)對(duì)象
構(gòu)造一個(gè)擴(kuò)展了指定類(lèi)和特質(zhì)的類(lèi)作為類(lèi)的對(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 類(lèi)繼承了month類(lèi)所有的非私有成員
week類(lèi)是month類(lèi)的子類(lèi),month類(lèi)是week類(lèi)的超類(lèi)
子類(lèi)能重寫(xiě)超類(lèi)成員(具有相同名稱和參數(shù))
class week(val num:int) extends month(var no:int){}
object day extends week{}
單例對(duì)象同樣能從類(lèi)中繼承,與類(lèi)的繼承語(yǔ)法相同
重寫(xiě)
scala中使用override保留字方法進(jìn)行方法重寫(xiě)
class week (override val lastday:string)extends month{}
override 保留字實(shí)際使用類(lèi)似private 申明這個(gè)保留字后的定義申明是對(duì)超類(lèi)的重寫(xiě),因此,其也可能寫(xiě)在類(lèi)定義的參數(shù)中
class week extends month(override val lastday:string){}
子類(lèi)重寫(xiě)或者修改sclala會(huì)檢查其超類(lèi),但是超類(lèi)的修改并不會(huì)檢查子類(lèi)
class month{def secondday(m:String)={}}
class week extends month{def secondday={}}
重寫(xiě)規(guī)則
重寫(xiě)def
用val 利用val能重寫(xiě)超類(lèi)用沒(méi)有參數(shù)的方法
用def子類(lèi)的方法與超類(lèi)方法重名
用var同時(shí)重寫(xiě)getter和setter方法。只重寫(xiě)getter方法報(bào)錯(cuò)
重寫(xiě)val
用val 子類(lèi)一個(gè)私有字段與超類(lèi)字段重名,getter方法重寫(xiě)超類(lèi)的getter方法
重寫(xiě)var
用var 且當(dāng)超類(lèi)的var是抽象的才能被重寫(xiě),否者超類(lèi)的var會(huì)被集成
class month{
val one=25//可在子類(lèi)用val重寫(xiě)
var two=15//不可在子類(lèi)中用var重寫(xiě),因?yàn)椴皇浅橄蟮?br/> var three:int
def firstday= 、、可在子類(lèi)中用val重寫(xiě)
def now= //可在子類(lèi)中用var重寫(xiě)
def now_=可在子類(lèi)中用def重寫(xiě)
def lastday(m:char)={}
}
子類(lèi)中def 只能重寫(xiě)超類(lèi)的def, val能重寫(xiě)超類(lèi)的val或不帶參數(shù)的def,var只能重寫(xiě)超類(lèi)中
抽象的var或者超類(lèi)的getter和setter
}
抽象
不能被實(shí)例的類(lèi)叫做抽象類(lèi)
抽象類(lèi)的某個(gè)或者某幾個(gè)成員沒(méi)有被完整的定義,這些沒(méi)有被完整定義的成員稱為抽象方法或者抽象字段
用abstract保留字段標(biāo)記抽象類(lèi)
abstract year{
val name:Array[string]//抽象的val帶有一個(gè)抽象的getter方法
var num:Int//抽象的var 帶有抽象的getter和setter方法
def sign //沒(méi)有方法體函數(shù)體,是一個(gè)抽象方法
}
只要類(lèi)中有一個(gè)抽象成員,必須使用abstract標(biāo)記
重寫(xiě)抽象方法,抽象字段不許愿使用override保留字
保護(hù)
當(dāng)一個(gè)類(lèi)不希望被繼承,拓展時(shí),可在類(lèi)申明前加上final保留字
final class year{}
當(dāng)一個(gè)類(lèi)某些成員不希望被重寫(xiě)時(shí),可在成員申明前加上final保留字
class year{final def sign{}}
當(dāng)超類(lèi)中某些成員需要被子類(lèi)繼承,又不想對(duì)子類(lèi)以外可見(jiàn)時(shí),在成員變量時(shí)加上protect保留字
protect【this】將訪問(wèn)權(quán)限定于當(dāng)前對(duì)象,類(lèi)似于private[this]
類(lèi)中protected的成員對(duì)其子類(lèi)可見(jiàn),對(duì)其超類(lèi)不可見(jiàn)
class year{protect def sign{}}
構(gòu)造
子類(lèi)構(gòu)造器的運(yùn)行在超類(lèi)構(gòu)造器運(yùn)行之后
在超類(lèi)的構(gòu)造器其中調(diào)用的成員被子類(lèi)重寫(xiě)之后,返回值可能不正確
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被子類(lèi)week重寫(xiě)了,但因?yàn)閣eek構(gòu)造器還沒(méi)有被調(diào)用num的值未被初始化因而返回
0 day 被設(shè)置長(zhǎng)度為0的數(shù)組,month構(gòu)造器運(yùn)行完畢,執(zhí)行week構(gòu)造器,num被初始化為7
解決方法
將超類(lèi)的val 申明為final
將超類(lèi)的val申明為lazy
在子類(lèi)中使用提前定義的語(yǔ)法
提前定義在超類(lèi)的構(gòu)造器運(yùn)行之前初始化子類(lèi)的字段
把需要提前定義的語(yǔ)句塊放在extends與超類(lèi)之間,并后接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沒(méi)有在之前提前定義
}with month{}
scala特質(zhì)
多重繼承
scala不支持多重繼承,取而代之的是特質(zhì)
一個(gè)子類(lèi)只能擁有一個(gè)超類(lèi),一個(gè)超類(lèi)能擁有多個(gè)子類(lèi)
冀class week extends month,year不合法
為什么
若一個(gè)子類(lèi)繼承自不同的超類(lèi) 不同的超類(lèi)中同名成員子類(lèi)不知如何處理
多重繼承產(chǎn)生菱形繼承問(wèn)題
解決多重繼承可能導(dǎo)致的問(wèn)題消耗的資源遠(yuǎn)比多重繼承產(chǎn)生的價(jià)值高
sclala使用特質(zhì)達(dá)到類(lèi)似多重繼承的效果
一個(gè)類(lèi)可以擴(kuò)展多個(gè)特質(zhì),一個(gè)特質(zhì)可以被多個(gè)類(lèi)擴(kuò)展
特質(zhì)使用
特質(zhì)是scala里代碼復(fù)用的基礎(chǔ)單元,封裝了方法和字段定義
特質(zhì)使用保留字trait 具體語(yǔ)法與類(lèi)定義相似,除了不能擁有構(gòu)造器
trait reset{
def reset (m:Int,n:Int)=if(m>n)1}
一旦特質(zhì)被定義了,就可以混入類(lèi)種
class week extends reset wiTH B WITH C{}
特質(zhì)中成員能是抽象的嗎
所有java接口都能當(dāng)做是特質(zhì)使用在scala中
特質(zhì)成員可以是抽象的,而且,不需要使用abstract申明
同樣的,重寫(xiě)特質(zhì)的抽象方法無(wú)需給出override
但是,多個(gè)特質(zhì)重寫(xiě)一個(gè)特質(zhì)的抽象方法需要override
除了在類(lèi)中定義混入特質(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í)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。