天天看點

Scala-面向對象引入(包、類和對象)

包對象

導包

類和對象 

方法和構造器

Scala 包的三大作用(和 Java 一樣):

  1. 區分相同名字的類
  2. 當類很多時,可以很好的管理類
  3. 控制通路範圍

基本文法

package 包名
           

Scala 有兩種包的管理風格,一種方式和 Java 的包管理風格相同,每個源檔案一個包(包 名和源檔案所在路徑不要求必須一緻),包名用“.”進行分隔以表示包的層級關系,如 com.pp.scala。另一種風格,通過嵌套的風格表示層級關系。

//使用嵌套風格定義包
package com {

  import com.pp.scala.Inner

  //在外層包中定義單例對象
  object  Outer{
    //外層包定義變量
    var out = "out"
    def main(args: Array[String]): Unit = {
      //在外層不能直接通路内層 如要通路則需要導包
      println(Inner.inner)
    }
  }

  package pp{

    package scala{

      //在内層包中定義單例對象
      object Inner{
        //内層包定義變量
        var inner = "inner"
        def main(args: Array[String]): Unit = {
          //内層包中可以直接通路外層包的東西
          println(Outer.out)
          //可更改外部包的變量
          Outer.out = "Inner"

          println(Outer.out)
        }
      }
    }
  }
}
           

包對象

在 Scala 中可以為每個包定義一個同名的包對象,定義在包對象中的成員,作為其對 應包下所有 class 和 object 的共享變量,可以被直接通路。

Scala-面向對象引入(包、類和對象)

在包 對象中定義共享屬性

Scala-面向對象引入(包、類和對象)

 在同名包下的Obj檔案中實作通路

Scala-面向對象引入(包、類和對象)

 導包

  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

Scala 中的三個預設導入分别是:

  • import java.lang._
  • import scala._
  • import scala.Predef._ 

類和對象 

一般,一個.java 有一個 public 類

注意:Scala 中沒有 public,一個.scala 中可以寫多個類。

Scala 文法中,類并不聲明為 public,所有這些類都具有公有可見性(即預設就是 public)

object cll {
  def main(args: Array[String]): Unit = {
    //建立對象測試
    var stu = new student()
    println(stu.getName)
    println(stu.getAge)
  }

}

//定義一個類
class student {

  //實作JavaBean的方法則要聲明注解
  //如果要定義成私有的則可加上private修飾符
  private val aa : String = "定義私有屬性"
  @BeanProperty
  //定義屬性
  val name: String = "aaa"
  @BeanProperty
  val age : Int = 10
  
}
           

方法和構造器

方法:

def 方法名(參數清單) [:傳回值類型] = { 
方法體
}
           

構造器:

和 Java 一樣,Scala 構造對象也需要調用構造方法,并且可以有任意多個構造方法。

Scala 類的構造器包括:主構造器和輔助構造器

class 類名(形參清單) { // 主構造器
 // 類體
 def this(形參清單) { // 輔助構造器
 }
 def this(形參清單) { //輔助構造器可以有多個...
 }
}
           
  1. 輔助構造器,函數的名稱 this,可以有多個,編譯器通過參數的個數及類型來區分。
  2. 輔助構造方法不能直接建構對象,必須直接或者間接調用主構造方法。
  3. 構造器調用其他另外的構造器,要求被調用構造器必須提前聲明。
object gou {
  def main(args: Array[String]): Unit = {
    //建立對象
    val s1 = new Student
    println(s1.name)
    //傳參建立對象
    val s2 = new Student("b",20)
    
  }
}

//定義一個類
class Student(){
  //定義屬性
  var name : String = "a"
  var age : Int = 1
  println("主構造方法被調用")

  //聲明輔助構造方法
  def this(name : String){
    this() //直接調用主構造器
    println("輔助造方法1被調用")
    this.name = name
    println(s"$name $age")
  }
  def this(name : String , age : Int){
    //方法重載
    this(name)
    println("輔助造方法2被調用")
    this.age = age
    println(s"$name $age")
  }
}
           

構造器參數:

Scala 類的主構造器函數的形參包括三種類型:未用任何修飾、var 修飾、val 修飾

  • 未用任何修飾符修飾,這個參數就是一個局部變量
  • object gou {
      def main(args: Array[String]): Unit = {
        val student2 : Student2 = new Student2("cc",20)
        //調用方法
        student2.Printt()
      }
    }
    
    //定義一個類
    //主構造器無修飾
    class Student2(name : String,age : Int){ //相當于已定義屬性
      def Printt(): Unit ={
        println(name)
        println(age)
      }
    }
               
  • var 修飾參數,作為類的成員屬性使用,可以修改
  • object gou {
      def main(args: Array[String]): Unit = {
      val s : Student1 = new Student1("name",12)
        println(s.age)
        println(s.name)
      }
    }
    
    //定義一個類
    class Student1(var name : String,var age : Int){ //相當于已定義屬性
    }
               
  • val 修飾參數,作為類隻讀屬性使用,不能修改