理解scala的伴生类和伴生对象

初次接触这两个概念觉得怪怪的。写了段代码测试了一下,帮助自己理解。

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内部可以访问。

 

posted @ 2019-03-14 10:24  Rabbit624  阅读(7743)  评论(0编辑  收藏  举报