scala語言中沒有static成員存在,可是scala容許以某種方式去使用static成員
這個就是伴生機制,所謂伴生,就是在語言層面上,把static成員和非static成員用不一樣的表達方式,class和object,
但雙方具備相同的package和name,可是最終編譯器會把他們編譯到一塊兒,這是純粹從語法層面上的約定。經過javap能夠反編譯看到。
另一個小魔法就是單例,單例本質上是經過伴生機制完成的,直接由編譯器生成一個class對象,這樣至少在底層可以統一。java
多個構造方法都須要調用默認的構造方法ide
class User (x:Int,age:Int){//默認構造器 val height = x; val this.age = age; var name =""; def this(){ this(5,5); } def this(t1:Int,t2:Int,name:String){ this(5,5); this.name= name; } }
class和object的調用方式this
class TestObject private{ val t2 = "lskjdfkljd" var t=123 def func01() = { println("gaga"); } } object TestObject { val t1 = 123; var ssssgagag=1444; val single = new TestObject(); def func02() = { println("gaga"); } def main(args: Array[String]) { val t1 = new TestObject(); println(t1.t2); t1.func01(); TestObject.func02(); println(TestObject.t1) println(TestObject.ssssgagag) } }
類的繼承和traitscala
trait Listen{ val name: String def listen() = { println("You friend " + name + " is listening") } } trait Read{ val name: String def read() = { println("You friend " + name + " is reading") } } trait Speak{ val name: String def speak() = { println("You friend " + name + " is speaking.") } } class Human(val name : String){ def listen() = { println(name + " is listening.") } } class Animal(val name: String){ } class Cat(override val name: String) extends Animal(name: String) with Speak with Listen with Read{ override def toString(): String = " hello "+name+"! " } object TestFriend { def main(args: Array[String]) { val f1 = new Listen();//java 接口很像 不能直接夠造 val h1 = new Human("gaga"); h1.listen(); //這樣scat就是Friend了 val scat = new Cat("hello kitty") scat.listen(); scat.speak() println(scat) } }