1. 程式人生 > 其它 >Scala (二)面向物件

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

作者:王陸 出處:https://www.cnblogs.com/wkfvawl/

-------------------------------------------

個性簽名:罔談彼短,靡持己長。做一個謙遜愛學的人!

本站使用「署名 4.0 國際」創作共享協議,轉載請在文章明顯位置註明作者及出處。鑑於博主處於考研複習期間,有什麼問題請在評論區中提出,博主儘可能當天回覆,加微信好友請註明原因