javascala
㈠ scala和java的區別
兩者之間的區別,首先是功能運作程度不同,其次是插件不同。
㈡ scala trait 介面java怎麼使用
今天說一說Java中的介面和Scala中的trait。一直就把特質當做半個介面用,因為確實挺像的,但仔細看,還是有很大區別的。
1.介面不會有構造器,特質可以有構造器,並且在實現類繼承特質的時候,先要調用特質的構造器。
trait構造器的調用順序小結:
class B{}
trait C extends E{}
trait D extends E{}
A extends B with C with D
(1)先調用父類構造器B
(2)繼承多個trait從從左至右依次執行,先調用父trait E構造器,再調用C,再調用D構造器
(3)如果多個trait繼承同一個父trait,則父trait只執行一次
(4)所有父類構造器和trait構造器執行完畢之後再執行自己的構造器A
2.介面中不能有未初始化的屬性,且屬性的修飾都是public static final,特質中可以有未初始化的屬性變數,即抽象欄位;
未初始化的屬性可以有提前定義的特性,有兩種方法,例如:
trait A{
val name:String//抽象欄位
println("name: "+name)//特質中構造器執行的語句
}
class B extends A{
val name:String = "張三"
}
此時如果在main函數中new B的話,肯定會報錯,因為new B必然先會調用特質中的構造器,而name並沒有被賦值,所以會報錯。有三種方法解決:
(1)class B extends {
val name:String = "張三" //提前定義在類前
} with A{}
(2)class B{}
main函數中new B的時候:
val b = new {
val name:String = "張三"//提前定義在new對象前
} with B with A
(3)利用lazy特性
trait A{
lazy val name:String = null
println("name: "+name)
}
class B extends A{
override lazy val name:String = "張三"
}