@java
static
關鍵字,static關鍵字修飾的變量、方法能夠使類對象共享,而非某個對象單獨擁有,因此是經過類名.變量名/方法名
去調用。而這違背了scala面向對象的初衷,由於這沒有經過對象去調用。scala的編譯與java大同小異:工具
Java運行原理this
Scala運行原理scala
觀察下面這段代碼,Scala01_HelloWorld.scalacode
object Scala01_HelloWorld { def main(args: Array[String]): Unit = { println("HelloScala") } }
通過編譯後,能夠看見,scala文件編譯成了兩個.class文件
使用反編譯工具打開看看它們:對象
Scala01_HelloWorld.class,伴生類blog
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的效果(類名.變量名/方法名
)編譯器
伴生對象it
注意:之後在Scala語言中,若是要定義相似java的static內容,都應該放到伴生對象中聲明