scala特质(特征)
在java中是存在接口interface的,而scala中使用特质trait来代替接口,多个类具有相同的特质时,就可以将这个特质独立出来,采用关键字 trait声明。 理解trait 等价于(interface + abstract class)
语法
1 | trait 特证名 { |
1 | // 定义特质 |
在java中是存在接口interface的,而scala中使用特质trait来代替接口,多个类具有相同的特质时,就可以将这个特质独立出来,采用关键字 trait声明。 理解trait 等价于(interface + abstract class)
语法
1 | trait 特证名 { |
1 | // 定义特质 |
scala与java一样,也存在继承,且也支持单继承,同样使用extends关键字(如果将类声明为final,就不能被继承。如果将方法或字段声明为final,就不能被重写)
语法
1 | class 子类名 extends 父类名 { 类体 } |
1 | object TestExtends { |
在之前的例子中也看到过有的文件中既声明了class又声明了object,这两个有什么区别呢,为什么main方法要在object中而不能和java一样在class中呢?
这是因为scala中将static关键字去掉了,采用了伴生类和伴生对象的概念来区分静态和非静态,在伴生类中的都是非静态的,而在伴生对象中声明的都是静态的
1 | // 伴生类 |
在java中有四种访问修饰符,public、protected、default、private,那么scala中呢?
当属性访问权限为默认时,从底层看属性是private的,但是因为提供了 xxx_$eq()[类似setter]/xxx()[类似getter] 方法,因此从使用效果看是任何地方 都可以访问)
当方法访问权限为默认时,默认为public访问权限
private为私有权限,只在类的内部和伴生对象中可用
protected为受保护权限,scala中受保护权限比Java中更严格,只能子类访问, 同包无法访问(这里是编译器限制的,编译完成java之后其实是public的)
在scala中没有public关键字,即不能用public显式的修饰属性和方法
包访问权限(表示属性有了限制。同时包也有了限制),这点和Java不一样, 体现出Scala包使用的灵活性
1 | class Dog { |