1. 程式人生 > 其它 >解析scala的伴生類和伴生物件所屬類

解析scala的伴生類和伴生物件所屬類

技術標籤:scalascala

文章目錄

說在前面

  • scala是純面向物件的語言,C是純面向過程的語言,Java就是面向過程+面向物件的語言。
  • 在說到伴生物件之前,要先說到java的static關鍵字,static關鍵字修飾的變數、方法可以使類物件共享,而非某個物件單獨擁有,所以是通過類名.變數名/方法名去呼叫。而這違背了scala面向物件的初衷,因為這沒有通過物件去呼叫

執行原理

scala的編譯與java大同小異:

  • Java執行原理

    • 先編譯,再解釋
    • .java原始檔—>編譯器(javac)—>.class位元組碼檔案—>JVM(java 不同平臺)—>機器指令
  • Scala執行原理

    • 先編譯,再解釋
    • .scala原始檔—>編譯器(scalac)—>.class位元組碼檔案—>JVM(scala 不同平臺)—>機器指令

程式碼體現

觀察下面這段程式碼,Scala01_HelloWorld.scala

object Scala01_HelloWorld {

  def main(args: Array[String]): Unit = {
  
    println("HelloScala")
    
  }
  
}

經過編譯後,可以看見,scala檔案編譯成了兩個.class檔案
在這裡插入圖片描述
使用反編譯工具開啟看看它們:

Scala01_HelloWorld.class伴生類

package com.sun.scala.chapter01;

import scala.reflect.ScalaSignature;

@ScalaSignature(bytes="\006\001):Q!\001\002\t\002-\t\021cU2bY\006\004\024g\030%fY2|wk\034:e\025\t\031A!A\005dQ\006\004H/\032:1c)\021QAB\001\006g\016\fG.\031\006\003\017!\t1a];o\025\005I\021aA2p[\016\001\001C\001\007\016\033\005\021a!\002\b\003\021\003y!!E*dC2\f\007'M0IK2dwnV8sIN\021Q\002\005\t\003#Mi\021A\005\006\002\013%\021AC\005\002\007\003:L(+\0324\t\013YiA\021A\f\002\rqJg.\033;?)\005Y\001\"B\r\016\t\003Q\022\001B7bS:$\"a\007\020\021\005Ea\022BA\017\023\005\021)f.\033;\t\013}A\002\031\001\021\002\t\005\024xm\035\t\004#\005\032\023B\001\022\023\005\025\t%O]1z!\t!sE\004\002\022K%\021aEE\001\007!J,G-\0324\n\005!J#AB*ue&twM\003\002'%\001"
) public final class Scala01_HelloWord { public static void main(String[] paramArrayOfString) { Scala01_HelloWord..MODULE$.main(paramArrayOfString); } }

Scala01_HelloWorld$.class伴生物件所屬類

package com.sun.scala.chapter01;

import scala.Predef.;

public final class Scala01_HelloWord$
{
  public static final  MODULE$;

  static
  {
    	new ();
  }

  public void main(String[] args)
  {
    	Predef..MODULE$.println("hello,scala");
  }
  
  private Scala01_HelloWord$() 
  { 
  		MODULE$ = this; 
  }

}

解析

  • object 名稱
    從語法角度講,上面語法表示聲明瞭一個伴生物件
    Scala是純面向物件的,去除了java中的static關鍵字,通過伴生物件模擬static的效果(類名.變數名/方法名
  • 伴生物件
    • 伴隨著某個類產生的一個物件
    • 當我們對原始檔進行編譯之後,預設會生成兩個位元組碼檔案,一個是伴生類,另一個是伴生物件所屬類
    • 真正的伴生物件是伴生物件所屬類中建立的單例物件
    • 如果不想預設生成伴生類,可以手動生成,要求伴生類名稱和伴生物件名稱一致
    • 所以在scala程式中,如果要想實現static效果,那麼我們應該使用object關鍵字將屬性以及方法定義在伴生物件類中