scala類:java
scala中類定義裏,能夠放置字段和方法,這些被統稱爲成員(memeber)閉包
全部成員默認是共有的,如java中默認帶public同樣app
scala中不能定義靜態成員,可是能夠定義單例對象,用法java的static成員用法同樣,對象名.成員。函數
若是定義的一個class A與object A而且他們在同一個文件裏面他們就是伴生關係(singleton)class A是 object A的伴生類,反過來object A是class A的伴生對象,他們能夠相互訪問對方的私有成員ui
scala中private修飾了的成員,同一個類型的對象能夠訪問另外一個同類型的私有成員.如:this
classA{private val other = 1; def A(a:A){a.other+1}}
spa
限定只能當前類使用:使用private[this]scala
classA{private[this] val other = 1; def A(){other+1}}對象
scala中的構造器有一個主構造器和多個副構造器,組構造器是在建立class A類的時候就已經定義了,若是讓主構造器new 的時候就帶參數就class A(val name : String){ }必需要帶上val或var,否則他不會生成對應成員,只是當作一個val的構造器參數。
遞歸
若是成員加上@BeanProperty 註解 如:@BeanProperty var name : String = "" scala會默認的給他生成getName和setName這2個方法。
若是想讓主構造器變成私有的能夠class A private (val name : String){ def this(){this(name)} } 這樣用戶只能調用副構造器來構造A對象了。主構造器是有參構造,副構造器是無參構造。
若是有確實值class A private(val name : String = "san"){}用到時的時候能夠new A就能夠獲得類的實例。
scala中的嵌套類的建立方式 new 外部類.嵌套類,java中的內部類的建立方式 new 外部類().new 內部類();而且在scala在使用嵌套類的時候他的類型是爲外部類.嵌套類(如類型爲 my.foot 或 her.foot)表示這個個人腳與她的腳是不通的類型。
scala中的類型投影:val a = new ArrayBuffer[Network#Member] 其含義是「任何Network的Member」
require(d != 0) 是Scala 中的方法、主構造器要求調用發必須知足的先決條件,是一種限制,確保了程序的正常運行。看起來功能相似於斷言機制,可是 Scala 中也有斷言啊,因此我目前還不明白這二者的區別所在。
閉包:函數字面量在運行時建立的函數值被稱爲閉包。如:var y=1;val addMore = (x:Int) => x+y
閉封項:不帶自由變量的函數字面量被稱爲閉封項。如:val addMore = (x:Int) => x + 1
重複參數:def echo(args : String*) = args.foreach(println);String*的args其實是Array[String],若是你想將Array[String]類型當作參數傳去echo中的話,傳入的時候加上"_*",這個是標註告訴編譯器把arr的原素當作參數,而不是單一的參數傳給echo。val arr=Array("Hello","world"); val a = echo(arr: _*);
尾遞歸:當遞歸最後一個動做是調用本身的函數時咱們就稱這個遞給是尾遞歸。
柯里化(currying):柯里化的函數是被應用於多個參數列表,而不單單是一個。
如:def a(x:Int,y:Int) = x + y; 柯里化後:def a(x:Int)(y:Int) = x + y;
柯里化的實質是先傳入x=1,返回一個函數 def b(y:Int) = 1 + y;在將y傳入獲得值。
傳遞一個函數:def a(x:Int,func:(Int,Int)=>Int),func就是傳入一個帶2個Int參數,返回一個Int值得函數。
傳名參數:def a(x : => Boolean){ println(x)};def b(x : ()=> Boolean){ println(x)}省略(),調用的時候能夠
a(1>2),但是函數b只能b(()=>1>2)。傳名參數是先建立一個函數,其apply方法將評估1>2。在傳遞給a.與
def c(x:Boolean){println(x)}不同,c(1>2)是先評估1>2的值直接傳給c