Scala (二)面向物件
第一章 面向物件
Scala 的面向物件思想和 Java 的面向物件思想和概念是一致的。
Scala 中語法和 Java 不同,補充了更多的功能。
1.1 Scala 包
1)基本語法
package 包名
2)Scala 包的三大作用(和 Java 一樣)
(1)區分相同名字的類
(2)當類很多時,可以很好的管理類
(3)控制訪問範圍
1.1.1 包的命名
1)命名規則
只能包含數字、字母、下劃線、小圓點.,但不能用數字開頭,也不要使用關鍵字。
2)案例實操
demo.class.exec1 //錯誤,因為 class 關鍵字 demo.12a //錯誤,數字開頭
3)命名規範
一般是小寫字母+小圓點
com.公司名.專案名.業務模組名
4)案例實操
com.atguigu.oa.model
com.atguigu.oa.controller
com.sohu.bank.order
1.1.2 包說明(包語句)
1)說明
Scala 有兩種包的管理風格,一種方式和 Java 的包管理風格相同,每個原始檔一個包(包名和原始檔所在路徑不要求必須一致),包名用“.”進行分隔以表示包的層級關係,如com.atguigu.scala。另一種風格,通過巢狀的風格表示層級關係,如下
package com{ package atguigu{ package scala{ } } }
第二種風格有以下特點:
(1)一個原始檔中可以宣告多個 package
(2)子包中的類可以直接訪問父包中的內容,而無需導包
2)案例實操
package com{ import com.atguigu.scala.Inner//父包訪問子包需要導包 // 在外層包中定義單例物件 object Outer{ var out: String = "out" def main(args: Array[String]): Unit = { println(Inner.in) } } package atguigu{ package scala{ // 內層包中定義單例物件 object Inner{ var in: String = "in" def main(args: Array[String]): Unit= { println(Outer.out)//子包訪問父包無需導包 Outer.out = "outer" println(Outer.out) } } } } } // 在同一檔案中定義不同的包 package aaa{ package bbb{ object Test01_Package{ def main(args: Array[String]): Unit = { import com.atguigu.scala.Inner println(Inner.in) } } } }
1.1.3 包物件
在 Scala 中可以為每個包定義一個同名的包物件,定義在包物件中的成員,作為其對應包下所有 class 和 object 的共享變數,可以被直接訪問。
1)定義
package object com{ val shareValue="share" def shareMethod()={} }
2)說明
(1)若使用 Java 的包管理風格,則包物件一般定義在其對應包下的 package.scala檔案中,包物件名與包名保持一致。
(2)如採用巢狀方式管理包,則包物件可與包定義在同一檔案中,但是要保證包物件與包宣告在同一作用域中。
// 定義一個類 class Student { // 定義屬性 private var name: String = "alice" @BeanProperty var age: Int = _ var sex: String = _ } package com { object Outer { val out: String = "out" def main(args: Array[String]): Unit = { println(name) } } } package object com { val name: String = "com" }
1.1.4 導包說明
1)和 Java 一樣,可以在頂部使用 import 匯入,在這個檔案中的所有類都可以使用。
2)區域性匯入:什麼時候使用,什麼時候匯入。在其作用範圍內都可以使用
3)萬用字元匯入:import java.util._
4)給類起名:import java.util.{ArrayList=>JL}
5)匯入相同包的多個類:import java.util.{HashSet, ArrayList}
6)遮蔽類:import java.util.{ArrayList =>_,_}
7)匯入包的絕對路徑:new _root_.java.util.HashMap
package java { package util { class HashMap { } } }
說明:
2)注意
Scala 中的三個預設匯入分別是
import java.lang._ import scala._ import scala.Predef._
1.2 類和物件
類:可以看成一個模板
物件:表示具體的事物
1.2.1 定義類
1)回顧:Java 中的類,如果類是 public 的,則必須和檔名一致。
一般,一個.java 有一個 public 類
注意:Scala 中沒有 public,一個.scala 中可以寫多個類。
1)基本語法
[修飾符] class 類名 { 類體 }
說明
(1)Scala 語法中,類並不宣告為 public,所有這些類都具有公有可見性(即預設就是public)
(2)一個 Scala 原始檔可以包含多個類
2)案例實操
package com.atguigu.chapter06 //(1)Scala 語法中,類並不宣告為 public,所有這些類都具有公有可見性(即預設就是 public) class Person { } //(2)一個 Scala 原始檔可以包含多個類 class Teacher{ }
1.2.2 屬性
屬性是類的一個組成部分
1)基本語法
[修飾符] var|val 屬性名稱 [:型別] = 屬性值
注:Bean 屬性(@BeanPropetry),可以自動生成規範的 setXxx/getXxx 方法
2)案例實操
package com.atguigu.scala.test import scala.beans.BeanProperty class Person { var name: String = "bobo" //定義屬性 var age: Int = _ // _表示給屬性一個預設值 //Bean 屬性(@BeanProperty) @BeanProperty var sex: String = "男" //val 修飾的屬性不能賦預設值,必須顯示指定 } object Person { def main(args: Array[String]): Unit = { var person = new Person() println(person.name) person.setSex("女") println(person.getSex) } }
1.3 封裝
封裝就是把抽象出的資料和對資料的操作封裝在一起,資料被保護在內部,程式的其它部分只有通過被授權的操作(成員方法),才能對資料進行操作。
Java 封裝操作如下,
(1)將屬性進行私有化
(2)提供一個公共的 set 方法,用於對屬性賦值
(3)提供一個公共的 get 方法,用於獲取屬性的值
Scala 中的 public 屬性,底層實際為 private,並通過 get 方法(obj.field())和 set 方法(obj.field_=(value))對其進行操作。所以 Scala 並不推薦將屬性設為 private,再為其設定public 的 get 和 set 方法的做法。
但由於很多 Java 框架都利用反射呼叫 getXXX 和 setXXX 方法,有時候為了和這些框架相容,也會為 Scala 的屬性設定 getXXX 和 setXXX 方法(通過@BeanProperty 註解實現)。
1.1.5 訪問許可權
1)說明
在 Java 中,訪問許可權分為:public,private,protected 和預設。在 Scala 中,你可以通
過類似的修飾符達到同樣的效果。但是使用上有區別。
(1)Scala 中屬性和方法的預設訪問許可權為 public,但 Scala 中無 public 關鍵字。
(2)private 為私有許可權,只在類的內部和伴生物件中可用。
(3)protected 為受保護許可權,Scala 中受保護許可權比 Java 中更嚴格,同類、子類可以
訪問,同包無法訪問。
(4)private[包名]增加包訪問許可權,包名下的其他類也可以使用
2)案例實操
package com.atguigu.scala.test
-------------------------------------------
個性簽名:罔談彼短,靡持己長。做一個謙遜愛學的人!
本站使用「署名 4.0 國際」創作共享協議,轉載請在文章明顯位置註明作者及出處。鑑於博主處於考研複習期間,有什麼問題請在評論區中提出,博主儘可能當天回覆,加微信好友請註明原因