長(zhǎng)沙哪里做網(wǎng)站好今日國(guó)內(nèi)新聞?lì)^條15條
目錄
- 第六章 類
- 1- 簡(jiǎn)單類和無(wú)參方法
- 2- 帶有g(shù)etter和setter的屬性
- 3- 只帶getter的屬性
- 4- 對(duì)象私有化
- 5- 輔助構(gòu)造器
- 6- 主構(gòu)造器
- 7- 嵌套類
- end
第六章 類
在Scala中, 類用于創(chuàng)建對(duì)象的藍(lán)圖;
類可以包含方法、值、變量、類型、對(duì)象和特質(zhì)等成員;
類名應(yīng)該以大寫(xiě)字母開(kāi)頭, 可以包含構(gòu)造函數(shù)、主題和方法等
可以使用class
關(guān)鍵字定義類, 并使用new
關(guān)鍵字實(shí)例化類;
1- 簡(jiǎn)單類和無(wú)參方法
定義簡(jiǎn)單類
: 使用關(guān)鍵字class
定義一個(gè)簡(jiǎn)單類:
// 定義一個(gè)簡(jiǎn)單的類class Person {// 類體def greet(): Unit = {println("Hello, world!")}}// 創(chuàng)建類的實(shí)例val person = new Person()person.greet() // 調(diào)用類中的方法 輸出 "Hello, world!"
// 定義一個(gè)簡(jiǎn)單的Point類class Point(val x: Int, val y: Int) {// 類體: 定義一個(gè)方法,返回一個(gè)Point對(duì)象def move(dx: Int, dy: Int): Point = {new Point(x + dx, y + dy)}override def toString: String = {s"($x, $y)"}}// 創(chuàng)建一個(gè)Point類的實(shí)例val p = new Point(1, 2)println(p) // 輸出: (1,2)println(p.x) // 輸出: 1println(p.move(2, 3)) // 輸出: (3,5)println(p.move(2, 3).move(1, 2)) // 輸出: (4,7)
無(wú)參方法
: 在Scala中, 你可以定義不帶參數(shù)的方法; 方法可以包含方法體和返回類型;
// 無(wú)參方法class Calculator {def add(): Int = {val a = 10val b = 20a + b}}// 創(chuàng)建類的實(shí)例val calculator = new Calculator()val result = calculator.add()println(result) // 輸出: 30
2- 帶有g(shù)etter和setter的屬性
在Scala中, 你可以使用帶有getter
和 setter
的屬性來(lái)定義類的成員變量;
這些屬性允許你控制對(duì)類成員的訪問(wèn)和修改;
class Person {// 私有成員變量, 帶有 getter 和 setter 方法private var _name: String = "Alice"// getter方法def name: String = _name// setter方法def name_=(newName: String): Unit = {if (newName.nonEmpty) {_name = newName}}}// 創(chuàng)建Person類的示例 對(duì)象val person = new Person()// 使用getter獲取屬性值println(person.name) // 輸出: Alice// 使用setter設(shè)置屬性值person.name = "Bob"println(person.name) // 輸出: Bob// 嘗試設(shè)置空字符串, 不會(huì)修改屬性值person.name = ""println(person.name) // 輸出: Bob
上面示例中, 定義了一個(gè) Person
類, 其中 _name
是一個(gè)私有的成員變量;
通過(guò)定義name
和 name_=
方法, 實(shí)現(xiàn)了屬性 name
的 getter 和 setter ;
在示例化 Person
類后, 我們可以使用getter 獲取屬性值, 使用 setter 設(shè)置新的屬性值;
在 setter中, 添加了條件來(lái)確保新值非空 ;
通過(guò)使用帶有 getter
和 setter
的屬性, 可以更靈活地控制類成員的訪問(wèn)和修改;
3- 只帶getter的屬性
在Scala中, 你可以創(chuàng)建只帶getter
而沒(méi)有setter
的屬性, 這意味著這些屬性只能被讀取而無(wú)法被修改;
這種屬性通常用于表示只讀數(shù)據(jù)或計(jì)算得出的值;
示例:
class Person {// 私有成員變量, 只帶getterprivate var _age: Int = 26// 只帶getter的屬性def age: Int = _age}
// 創(chuàng)建Person類的實(shí)例 對(duì)象val p = new Person// 使用getter獲取屬性值println(p.age) // 輸出: 26// 嘗試修改 只帶 getter的屬性, 會(huì)導(dǎo)致編譯錯(cuò)誤// p.age = 27 // 編譯錯(cuò)誤: Reassignment to val
在上面的示例中, 我們定義了一個(gè) Person
類, 其中 _age
是一個(gè)私有的成員變量;
通過(guò)定義age
方法, 我們實(shí)現(xiàn)了只帶 getter
的屬性;
在實(shí)例化Person
類后, 我們無(wú)法使用 setter
來(lái)修改 age
屬性, 只能使用 getter
來(lái)獲取屬性值;
通過(guò)創(chuàng)建只帶 getter
的屬性, 您可以確保某些屬性在對(duì)象創(chuàng)建后不會(huì)被意外修改, 從而增加代碼的安全性和可靠性;
4- 對(duì)象私有化
在Scala中, 你可以使用 private[this]
來(lái)定義對(duì)象私有化的成員變量或方法;
對(duì)象私有化意味著只有同一個(gè)對(duì)象內(nèi)部的其他成員才能訪問(wèn)這些私有成員, 而其它對(duì)象無(wú)法訪問(wèn);
這種私有化級(jí)別比普通的私有化更嚴(yán)格, 確保了數(shù)據(jù)的封裝性和安全性 .
示例:
class Person {private[this] var secret: String = "I have a secret!"def revealSecret(anotherPerson: Person): Unit = {// 無(wú)法訪問(wèn)另一個(gè) Person 對(duì)象的私有成員//println(anotherPerson.secret) // 這行代碼會(huì)導(dǎo)致編譯錯(cuò)誤println(s"My secret is: $secret")}}
// 創(chuàng)建兩個(gè) Person 對(duì)象val p1 = new Personval p2 = new Person// 嘗試訪問(wèn)對(duì)象私有化的成員// println(p1.secret) // 這行代碼會(huì)導(dǎo)致編譯錯(cuò)誤// 調(diào)用revealSecret方法p1.revealSecret(p2) // 這行代碼不會(huì)導(dǎo)致編譯錯(cuò)誤 // 輸出:My secret is: I have a secret!
在上面的示例中, 我們定義了一個(gè) Person
類, 其中 secret
被聲明為對(duì)象私有化的成員變量;
在 revealSecret
方法中, 我們嘗試訪問(wèn)領(lǐng)一個(gè) Person
對(duì)象的私有成員, 但是由于對(duì)象私有化的限制, 這會(huì)導(dǎo)致編譯錯(cuò)誤;
5- 輔助構(gòu)造器
在Scala中, 輔助構(gòu)造器(Auxiliary Constructor) 是用于創(chuàng)建類的實(shí)例的額外構(gòu)造函數(shù) ;
輔助構(gòu)造器允許你以不同的方式初始化對(duì)象, 為類的使用者提供更多的靈活性 ;
在Scala中, 輔助構(gòu)造器使用 def this(...)
語(yǔ)法定義, 可以有多個(gè)輔助構(gòu)造器;
輔助構(gòu)造器必須以調(diào)用主構(gòu)造器或其他輔助構(gòu)造器的方式開(kāi)始 ;
class Student(val name: String, val age: Int) {def this(name: String) {this(name, 18) // 調(diào)用主構(gòu)造器}def this() {this("Unknown") // 調(diào)用另一個(gè)輔助構(gòu)造器}}
// 創(chuàng)建 Student 類的實(shí)例val student1 = new Student()val student2 = new Student("Tom")val student3 = new Student("Bob", 20)println(student1.name, student1.age) // 輸出:(Unknown,18)println(student2.name, student2.age) // 輸出:(Tom,18)println(student3.name, student3.age) // 輸出:(Bob,20)
- 在上面的示例中,
Student
類有一個(gè)主構(gòu)造器和兩個(gè)輔助構(gòu)造器 ; - 第一個(gè)輔助構(gòu)造器接受一個(gè)參數(shù)
name
參數(shù), 調(diào)用主構(gòu)造器并將age
設(shè)置為默認(rèn)值 18 ; - 第二個(gè)輔助構(gòu)造器沒(méi)有參數(shù), 調(diào)用另一個(gè)輔助構(gòu)造器并將
name
設(shè)置為 “Unknown” ;
創(chuàng)建類的實(shí)例時(shí), Scala會(huì)根據(jù)提供的參數(shù)自動(dòng)選擇調(diào)用合適的構(gòu)造器 ;
你可以根據(jù)需要選擇不同的輔助構(gòu)造器來(lái)初始化對(duì)象, 提供更多的構(gòu)造選項(xiàng) ;
輔助構(gòu)造器為Scala中面向?qū)ο缶幊處?lái)了更多的遍歷性和可定制性 .
6- 主構(gòu)造器
在Scala中, 主構(gòu)造器(Primary Constructor) 是類定義中的一部分, 用于初始化類的實(shí)例;
主構(gòu)造器可以接受參數(shù), 并在類實(shí)例化時(shí)執(zhí)行初始化操作 ;
- 定義主構(gòu)造器
- 主構(gòu)造器直接放在類名后面, 可以接受參數(shù)并在類實(shí)例化時(shí)執(zhí)行初始化
- 主構(gòu)造器可以包含參數(shù)列表, 這些參數(shù)可以在類的其他地方方法中使用
- 示例代碼
// 主構(gòu)造器class Person(val name: String, val age: Int) {println(s"Creating a Person with name: $name and age: $age")def displayInfo(): Unit = {println(s"Name: $name, Age: $age")}}// 創(chuàng)建 Person 實(shí)例對(duì)象val person1 = new Person("John", 30) // Output: Creating a Person with name: John and age: 30val person2 = new Person("Jane", 28) // Output: Creating a Person with name: Jane and age: 28// 調(diào)用 displayInfo 方法顯示信息person1.displayInfo() // Output: Name: John, Age: 30person2.displayInfo() // Output: Name: Jane, Age: 28
- 示例解釋
- 在上面的示例中,
Person
類有一個(gè)主構(gòu)造器, 接受name
和age
兩個(gè)參數(shù) - 在類實(shí)例化時(shí), 主構(gòu)造器會(huì)被調(diào)用, 打印初始化信息
displayInfo
方法用于顯示Person
對(duì)象的信息, 包括姓名和年齡
- 在上面的示例中,
- 主構(gòu)造器的特點(diǎn)
- 主構(gòu)造器可以在類的定義中直接使用, 無(wú)需額外的
def this()
語(yǔ)法 - 主構(gòu)造器可以初始化類的成員變量, 并在類實(shí)例化時(shí)執(zhí)行初始化邏輯
- 主構(gòu)造器可以在類的定義中直接使用, 無(wú)需額外的
通過(guò)主構(gòu)造器, 你可以定義類的初始化方式, 并在實(shí)例化類時(shí)執(zhí)行必要的初始化操作 ;
主構(gòu)造器是Scala中類的重要組成部分, 用于初始化類的實(shí)例 .
7- 嵌套類
在Scala中, 嵌套類(Nested Class) 是指一個(gè)類定義在另外一個(gè)類的內(nèi)部 ;
與 Java等語(yǔ)言不同, Scala中的嵌套類是與外部對(duì)象綁定的, 而不是與外部類綁定 ;
這意味著每個(gè)外部對(duì)象都有自己的嵌套類實(shí)例 ;
- 定義嵌套類
- 在Scala中, 可以在一個(gè)類的內(nèi)部定義另一個(gè)類, 這就是嵌套類
- 嵌套類可以訪問(wèn)外部類的成員, 但是外部類無(wú)法直接訪問(wèn)嵌套類的成員
- 示例代碼
// 嵌套類class Outer {class Inner {def display(): Unit = {println("Inner class method;")}}}
// 創(chuàng)建 Outer 類的實(shí)例val outer = new Outer()// 創(chuàng)建 Inner 類的實(shí)例val inner = new outer.Inner()inner.display() // Inner class method;
- 示例解釋
- 在上面的示例中,
Inner
類是Outer
類的嵌套類 - 在創(chuàng)建
Inner
類的實(shí)例時(shí), 需要使用外部對(duì)象Outer
的示例來(lái)訪問(wèn)嵌套類 Inner
類的示例可以訪問(wèn)Outer
類的成員, 但是Outer
類的實(shí)例無(wú)法直接訪問(wèn)Inner
類的成員
- 在上面的示例中,
- 嵌套類的特點(diǎn)
- 嵌套類可以幫助組織和封裝相關(guān)的類, 使代碼更具可讀性和模塊化
- 每個(gè)外部對(duì)象都有自己的嵌套類實(shí)例, 不同外部對(duì)象的嵌套類實(shí)例時(shí)相互獨(dú)立的
通過(guò)嵌套類, 你可以在Scala中創(chuàng)建更加結(jié)構(gòu)化和模塊化的代碼, 將相關(guān)的類組織在一起, 提高代碼的可維護(hù)性和可讀性 .