好程序員大數(shù)據(jù)教程Scala系列之類

好程序員大數(shù)據(jù)教程Scala系列之類

成都創(chuàng)新互聯(lián)是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來(lái)公司不斷探索創(chuàng)新,始終堅(jiān)持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過(guò)去的十載時(shí)間我們累計(jì)服務(wù)了上千家以及全國(guó)政企客戶,如成都酒樓設(shè)計(jì)等企業(yè)單位,完善的項(xiàng)目管理流程,嚴(yán)格把控項(xiàng)目進(jìn)度與質(zhì)量監(jiān)控加上過(guò)硬的技術(shù)實(shí)力獲得客戶的一致稱揚(yáng)。

  1. 類的定義

Scala 訪問(wèn)修飾符基本和Java的一樣,分別有:private,protected,public。

如果沒(méi)有指定訪問(wèn)修飾符符,默認(rèn)情況下,Scala 對(duì)象的訪問(wèn)級(jí)別都是 public。

私有(Private)成員

用 private 關(guān)鍵字修飾,帶有此標(biāo)記的成員僅在包含了成員定義的類或?qū)ο髢?nèi)部可見(jiàn),同樣的規(guī)則還適用內(nèi)部類。

class Outer{
class Inner{
private def f(){println("f")}
class InnerMost{
f() // 正確
}
}
(new Inner).f() //錯(cuò)誤
}

(new Inner).f( ) 訪問(wèn)不合法是因?yàn)?f 在 Inner 中被聲明為 private,而訪問(wèn)不在類 Inner 之內(nèi)。

但在 InnerMost 里訪問(wèn) f 就沒(méi)有問(wèn)題的,因?yàn)檫@個(gè)訪問(wèn)包含在 Inner 類之內(nèi)。

Java中允許這兩種訪問(wèn),因?yàn)樗试S外部類訪問(wèn)內(nèi)部類的私有成員。

保護(hù)(Protected)成員

在 scala 中,對(duì)保護(hù)(Protected)成員的訪問(wèn)比 java 更嚴(yán)格一些。因?yàn)樗辉试S保護(hù)成員在定義了該成員的的類的子類中被訪問(wèn)。而在java中,用protected關(guān)鍵字修飾的成員,除了定義了該成員的類的子類可以訪問(wèn),同一個(gè)包里的其他類也可以進(jìn)行訪問(wèn)。

package p{
class Super{
protected def f() {println("f")}
}
class Sub extends Super{
f()
}
class Other{
(new Super).f() //錯(cuò)誤
}
}

類的定義示例:

//定義Point類,構(gòu)造器帶有兩個(gè)參數(shù)
class Point(var x: Int, var y: Int) {

//無(wú)返回值的類方法

def move(dx: Int, dy: Int): Unit = {
x = x + dx
y = y + dy
}

//沒(méi)有參數(shù)但是返回值為String類型的重寫(xiě)方法

override def toString: String =
s"($x, $y)"
}

//創(chuàng)建類的實(shí)例
val point1 = new Point(2, 3)
point1.x // 2
println(point1) // prints (2, 3)

構(gòu)造器可以帶有默認(rèn)值:

class Point(var x: Int = 0, var y: Int = 0){
...
}
val origin = new Point // x, y都取默認(rèn)值0
val point1 = new Point(1)//x=1,y=0
println(point1.x) // prints 1

私有成員變量以及重新定義的Getter/Setter方法:

private var _x = 0
private var _y = 0
private val bound = 100

def x = x
def x
= (newValue: Int): Unit = {
if (newValue < bound) _x = newValue else printWarning
}

def y = y
def y
= (newValue: Int): Unit = {
if (newValue < bound) _y = newValue else printWarning
}

private def printWarning = println("WARNING: Out of bounds")
}

val point1 = new Point
point1.x = 99
point1.y = 101 // prints the warning

類定義中的其他細(xì)節(jié):

//在Scala中,類并不用聲明為public。
//Scala源文件中可以包含多個(gè)類,所有這些類都具有公有可見(jiàn)性。
class Person {
//用val修飾的變量是只讀屬性的,只帶getter方法但沒(méi)有setter方法
//(相當(dāng)與Java中用final修飾的變量)
//字段必須初始化
val id = "1234"

//用var修飾的變量,默認(rèn)同時(shí)有公開(kāi)的getter方法和setter方法
var age: Int = 18

//類私有字段,有私有的getter方法和setter方法,只能在類的內(nèi)部使用
private var name: String = "王老五"

//對(duì)象私有字段,訪問(wèn)權(quán)限更加嚴(yán)格的,Person類的方法只能訪問(wèn)到當(dāng)前對(duì)象的字段
private[this] val hobby = "旅游"
}

scala中,在實(shí)現(xiàn)屬性時(shí)你有如下四個(gè)選擇:

var foo: Scala自動(dòng)合成一個(gè)getter和一個(gè)setter

val foo: Scala自動(dòng)合成一個(gè)getter

由你來(lái)定義foo和foo_=方法

由你來(lái)定義foo方法

  1. 構(gòu)造器
    注意:

1.主構(gòu)造器會(huì)執(zhí)行類定義中的所有語(yǔ)句

2.主構(gòu)造器如果有參數(shù)直接放置在類名之后

class ConstructorDemo ( val id: Int ) { … }

3.主構(gòu)造器變成私有的,可以像這樣放置private關(guān)鍵字:

class ConstructorDemo private ( val id: Int ) { … }

此時(shí),用戶必須通過(guò)輔助構(gòu)造器來(lái)構(gòu)造Person對(duì)象

class ConstructorDemo {

private var var1 = ""

private var var2 = 0

//輔助構(gòu)造器1
def this(var1:String) {
this() //調(diào)用主構(gòu)造器
this.var1 = var1
}

//輔助構(gòu)造器2
def this(var1:String, var2:Int) {
this(var1) //調(diào)用輔助構(gòu)造器1
this.var2 = var2
}

}

本文名稱:好程序員大數(shù)據(jù)教程Scala系列之類
鏈接URL:http://bm7419.com/article24/jcedje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作云服務(wù)器、網(wǎng)站導(dǎo)航、企業(yè)建站、、品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)