天天看點

Scala靜态程式設計實作方式-伴生對象伴生對象伴生對象 apply方法

文章目錄

  • 伴生對象
    • 注意事項
  • 伴生對象 apply方法

伴生對象

scala 語言是完全面向對象的,是以并沒有靜态操作,但是為了能夠和java語言互動就産生了一種特殊的對象來模拟類對象

實作java中的靜态的功能。這類特殊的對象我們稱之為伴生對象.

伴生類的所有靜态内容都可以放在它的伴生對象中,聲明和調用

注意事項

1)Scala中伴生對象采用object關鍵字來聲明,伴生對象中聲明的内容全是靜态内容,可以通過伴生對象的名稱直接調用

2)伴生對象對應的類稱之為伴生類,伴生對象的名稱要和伴生類名稱一樣

3)伴生對象中的屬性和方法都可以通過半生對象名直接調用通路

4)從文法角度來講所謂伴生對象其實就是類的靜态方法和成員的集合

5)從技術角度來講,scala還是沒有生成靜态的内容,隻不過将伴生對象生成了一個新的類實作屬性和方法的調用

6)從底層原理看,伴生對象實作靜态特性是依賴于public static final MODULE$來實作的

7)伴生對象的聲明應該和伴生類在同一個源碼檔案中,(不在一個檔案中運作會報錯)

8)如果calssA獨立存在,那麼A 就是一個類,如果Object A 獨立存在,那麼A就是一個靜态性質的對象,在object A中定義的

屬性和方法可以通過A.屬性和A.方法類調用

9)當一個檔案中存在伴生類和伴生對象時檔案圖示會發生變化

示例:

object Person{
  def hi(): Unit ={
    println("hi~~")
  }
  def main(args: Array[String]): Unit = {
    Person.hi()
    new Person();
  }
}
class Person{
  Person.hi();
}
           

底層java類反編譯結果

public class Person
{
  public static void main(String[] paramArrayOfString)
  {
    .MODULE$.main(paramArrayOfString);
  }

  public static void hi()
  {
    .MODULE$.hi();
  }

  public Person()
  {
    .MODULE$.hi();
  }
}

public final class Person$
{
  public static  MODULE$;

  static
  {
    new ();
  }

  public void hi()
  {
    Predef..MODULE$.println("hi~~"); }

  public void main(String[] args) {
    hi(); }

  private Person$() {
    MODULE$ = this;
  }
}
           

伴生對象 apply方法

在伴生對象中定義apply方法可以實作 :類名(參數)方式來建立對象執行個體

示例如下:

object Person{
  def hi(): Unit ={
    println("hi~~")
  }
  def apply(name:String)=new Person(name);//定義apply方法
  def apply(): Person = new Person()
  def main(args: Array[String]): Unit = {
    var p = Person("張勝");
    var p2 = Person();
    println(p.name)
    println(p2.name)
  }
}
class Person(pName:String){
  var name = pName;
  def this(){
    this("預設名稱");
  }
  def this(pName:String,page:Int){
    this(pName);
  }
}