實驗五 Scala面向物件程式設計
一、實驗目的
1、瞭解Scala語言面向物件程式設計的思想。
2、掌握Scala的類的定義方法。
3、掌握Scala的建構函式的構造方法。
4、掌握Scala中的單例物件、伴生物件以及繼承的概念。
二、實驗內容
該實驗主要對Scala的面向物件程式設計進行介紹,主要介紹了Scala面向物件程式設計的主要方法。結合Scala的類的定義、Scala物件的建構函式、單例物件、伴生物件、繼承進行了例項的演練。
三、實驗要求
1、JDK1.8環境
2、Scala-2.12.4(Scala-2.11.12)
3、本實驗基於Linux,可根據自身情況選擇平臺進行實驗。
4、根據實驗手冊的內容,按步驟完成練習。
四、準備知識
Scala是一門面向物件的語言。在Scala中,一切皆為物件函式是物件,數字也是物件。其定義物件的格式如下:
class A(x:Type,y:Type)
其中,首先是關鍵字class,其後是類名A,類名後的括號中是建構函式的引數列表。
Scala面向物件程式設計支援繼承,但是,在重寫一個非抽象方法必須使用override修飾符,只有在主建構函式中才可以往基類的建構函式裡寫引數。
Scala中,沒有靜態的概念,Scala中可以使用object來實現這些功能,直接用物件名來呼叫的方法都是採用這樣的一種實現方式。
Scala中需要使用object關鍵字來建立一個單例物件來為程式的執行提供入口,如果不建立單例物件,程式碼也能夠編譯成功,但是不會有任何輸出。單例物件中宣告的方法可以全域性訪問。單例物件可以擴充套件類和形狀。
當單例物件與某個類共享同一個名稱時,這個單例被稱作是這個類的伴生物件。必須在同一個原始檔裡定義類和它的伴生物件。類被稱為是這個單例物件的伴生類。類和它的伴生物件可以互相訪問其私有成員。
Scala中使用extends關鍵字來實現繼承。Scala支援各種型別的繼承,包括單一,多層次,多重和混合。可以在類中使用單一,多層次和層次結構。多重和混合只能通過使用特徵來實現。有以下幾個注意的地方:
1、 重寫一個非抽象方法必須使用override修飾符。
2、 只有住建構函式才可以往基類的建構函式裡寫引數。
3、 在子類中重寫超類的抽象方法時,不需要使用override關鍵字。
五、實驗步驟
1、定義Scala的類
使用class關鍵字定義類,如下所示。
我們可以使用new關鍵字來建立類的物件。
可以以以下方式來訪問建立的物件。
程式碼&&輸出:
2、Scala物件的建構函式
建構函式 ,是一種特殊的方法。主要用來在建立物件時初始化物件, 即為物件成員變數賦初始值,總與new運算子一起使用在建立物件的語句中。特別的一個類可以有多個建構函式 ,可根據其引數個數的不同或引數型別的不同來區分它們即建構函式的過載。
以Point類為例,在建構函式中,初始化了isOrigin,來判斷這個點是不是原點。
在scala中,this是一個關鍵字,用於引用當前物件。可以使用this關鍵字呼叫例項變數,方法,建構函式。可以使用this關鍵字來呼叫建構函式。必須確保this放在建構函式中的第一個語句,同時呼叫其它建構函式。
程式碼&&輸出
3****、單例物件示例
單例物件是一個通過object關鍵字而不是用class關鍵字宣告的物件。其它物件不需要呼叫在單例物件中宣告的方法。示例如下:
編譯執行後的結果如下。
Scala單例物件是十分重要的,沒有像在Java一樣,有靜態類、靜態成員、靜態方法,但是Scala提供了object物件,這個object物件類似於Java的靜態類,它的成員、它的方法都預設是靜態的。
程式碼&&輸出:
4****、伴生物件示例
伴生物件必須和其對應的類放在同一個原始檔中。
編譯執行結果如下:
程式碼&&輸出
5****、繼承示例
編譯後,執行結果如下所示。
6、類定義練習例項:
6.1建立Scala類,定義變數age,進行scalac編譯和javap反編譯,比較scala與java程式設計的異同
6.1.1建立Scala類,定義變數age,進行scalac編譯和javap反編譯,比較scala與Java程式設計的異同。在當前目錄下建立文字檔案Person.scala,在Person.scala中輸入以下內容,儲存後退出。
class Person{
var age = 0
}
6.1.2在終端中輸入scala命令進入scala命令列,用以下語句進行scala程式編譯
scalac Person.scala
6.1.3在scala命令列中利用javap命令反編譯,檢視輸出結果
javap -private Person
6.1.4修改Person.scala中的修飾符為val,如下圖:
6.1.5再次用scala編譯,再利用javap反編譯,比較區別
scalac Person.scala
javap –private Person
注意:
(1)var設定變數對應了Java程式設計中的set和get方法;
(2)在Scala中age()和age_$eq(int)對應了Java中的get()和set()方法;
(3)如果欄位是私有的,那麼get()和set()方法也是私有的,如果欄位是公有的,那麼get()和set()方法也是公有的;
(4)如果欄位是val,則只有get()方法生成;
6.2利用private[this]型別,表示私有欄位且使對應的欄位沒有set和get方法
6.2.1在當前目錄下建立檔案Person1.scala,輸入以下內容
6.2.2利用scalac編譯,再利用javap反編譯,檢視執行結果
6.3用@BeanProperty修飾字段,可以生成一個符合規範的JavaBean物件
6.3.1在當前目錄下建立檔案Person2.scala,寫入以下內容
6.3.2利用scalac編譯,再利用javap反編譯,檢視執行結果
6.4Scala中的類和物件程式設計
6.4.1開啟Scala IDE,如IDEA community。
6.4.2建立Scala工程Test1(注意:以下操作在IDEA中均存在不同介面效果,但操作步驟相同)
6.4.3建立包org.zkpk.scala
6.4.4建立類Person8.scala
6.4.5開啟Person8,建立主類Person8,並在Person8類名後定義構造器,構造器包含兩個常量屬性:name為xiaoli,age為18,在構造器中使用println方法輸出一句話,然後建立伴生物件,在伴生物件Object Person8中建立main方法,呼叫println輸出Person8物件的age屬性,程式碼如下圖所示:
6.4.6點選右鍵,選擇run as--->java application執行程式,檢視結果
6.5伴生物件
6.5.1在工程中建立Scala類,命名為Account,程式碼如下:
6.5.2建立伴生物件Account
6.5.3新建單例物件object Test2
6.5.4在單例物件Test2中建立main方法
6.5.5在main方法中建立物件例項,呼叫伴生類方法和伴生物件方法
6.5.6完整程式碼如下:
6.5.7點選右鍵,選擇run as--->java application執行程式,檢視輸出結果
6.6 Scala中的構造器
6.6.1建立類Person10.scala,整體程式碼如下:
6.6.2其中,第一步建立主構造器,引數為空,定義類屬性name和age
6.6.4第二步建立第一個輔助構造器
6.6.5第三步建立第二個輔助構造器
6.6.6最後建立單例物件object Test1,並在object Test1中建立main方法,在main方法中建立類物件,呼叫println方法列印物件屬性,程式碼如下:
6.6.7點選右鍵,選擇run as--->java application執行程式檢視結果
6.7編寫第一個完整的Scala程式
6.7.1建立Scala類,命名為Counter,整體程式碼如下:
6.7.2開啟Counter,寫入類方法
6.7.3在類Counter中,首先定義變數Account,並初始化為0(var account = 0),接著定義如下方法
6.7.4建立單例物件object EnterPoint
6.7.5在object EnterPoint中建立main方法
6.7.6在main方法中建立類物件例項,呼叫類方法
6.7.7點選右鍵,選擇run as--->java application執行,檢視結果
六、思考題
1.擴充套件如下的Employee類,新類Programmer對每次繳稅tax和獎金bonus收取20元手續費。
class Employee(initialSalary:Double){
private var salary = initialSalary
def tax(amount:Double) = { salary -= amount; salary }
def bonus(amount:Double) = { salary += amount; salary }
}
2.設計一個Point類,其x,y,z座標可以通過構造器提供。再設計一個子類Dimension,其構造器接受一個標籤值和x,y,z座標,如:
new Dimension(“Cube”,100,100,100)