初次接觸這兩個概念覺得怪怪的。寫了段代碼測試了一下,幫助自己理解。
scala里面沒有 static 關鍵字。那么如果想實現static的效果要怎么做呢? ==》 可以使用伴生對象
在同一個scala文件中定義一個類,同時定義一個同名的object,那么它們就是伴生類和伴生對象的關系,可以互相直接訪問私有的field。
伴生對象通常會使用apply函數定義伴生類的構造方法。 這樣在創建伴生類的對象時就可以省略 new 關鍵字。
//定義一個貓咪類,帶兩個參數:貓咪的名字和年齡。
class Cat(val name:String,val age:Int) {
//在類中定義一個方法,跟貓咪打招呼。
def sayHello = println(s"hi,${name},I guess you are ${age} years old,and you have ${Cat.clawNum} claws.")
// def sayHello = println(s"hi,${name},I guess you are ${age} years old.")
}
//定義一個貓咪的object,名字和貓咪類的類名必須完全一致。
object Cat{
//object的私有field,描述了爪子的數量。
private val clawNum = 4
// val clawNum = 4
// private[this] val clawNum = 4 //伴生類也不能夠直接訪問
// def sayHello = println(s"animals usually have ${clawNum} clows.")
def apply(name: String, age: Int): Cat = new Cat(name, age)
def apply(name: String): Cat = new Cat(name, 0)
//Cat.sayHi的方式調用
def sayHi = println("a cat says hi~.")
}
object里面的屬性和方法就可以看作是帶有static標識的。所以object中定義的方法 sayHi 不用使用類的實例調用,只能用靜態的方式調用。
測試代碼如下:
scala> val cat = Cat("mow",2)
cat: Cat = Cat@5fd9b663
scala> cat.sayHello
hi,mow,I guess you are 2 years old,and you have 4 claws.
scala> cat.sayHi
<console>:17: error: value sayHi is not a member of Cat
cat.sayHi
^
scala> Cat.sayHi
a cat says hi~.
上面的代碼如果類比成 java ,是下面這種形式和效果:
public class Cat {
private static int clawNum = 4;
private String name;
private int age;
public Cat(String name,int age){
this.name = name;
this.age = age;
}
public void sayHello() {
System.out.println("hi," + name + ",I guess you are " + age + " years old,and you have " + clawNum + " claws.");
}
public static void sayHi() {
System.out.println("a cat says hi~.");
}
public static void main(String[] args) {
Cat cat = new Cat("mimi",1);
cat.sayHello();
Cat.sayHi();
}
}
還要注意的是,如果object里面的屬性被修飾成private[this],那么伴生類也將無法直接訪問此屬性。private[this]是scala中最高級別的私有屬性,只有當前object內部可以訪問。