类的定义
- 不用写public,可以写private,并且可指定访问范围,如private[dunso],则该类只能在dunso包下被访问
- 类名和文件不用同名
- 使用object代表静态对象,定义在静态对象里面的方法是静态方法,定义在静态对象里面的变量是静态变量
- 伴生对象:使用object定义的,在同一个文件中,和类的名字相同
- 如果类没有构造方法,在创建对象的时候,可以不加括号,直接new类的名字
- 使用val定义的属性,可以读,不能改,相当于只有getter方法,没有setter方法,只能在类内部和伴生对象中访问,即相当于private修饰
- 使用var定义的属性,可以读也可以写,相当于基友getter方法,也有setter方法,只能在类内部和伴生对象中访问,即相当于private修饰
- 使用private修饰的属性,只能在类的内部和伴生对象中访问
- 在private后加上this,即private[this] 修饰的属性,只能在类的内部访问,不能在伴生对象中访问
- 在不确定各类型的默认值的情况下,可以使用“_”代替,即 var name : String = _
- 在定义类的时候,如果前面加上了case,则用于模式匹配match
构造器定义
主构造器跟在类名后面
class Person(val name: String, val age : Int) {}
- 此时name和age也是Person的成员变量
- 在定义的时候,可以给初始值
- 如果没有用val 或者var修饰,那么形参相当于private[this]修饰
- 形参还可以用private 修饰
- 如果主构造器使用private修饰,则构造器只能在伴生对象中使用
其他构造器为辅助构造器
def this(name : String, age : Int, gender : String){ // 辅助构造器不允许使用val修饰符修饰其形参
this(name, age)
}
辅助构造器中必须先调用主构造器,所以辅助构造器的参数一般会比主构造器的参数多,为了能够使用反射,我们一般将无参构造器定义成主构造器
class Person() {} // “()”可省略
trait
- 中文叫“特指”,相当于java 8的接口,里面可以有实现,也可以没有实现。
- 一个类只能继承一个类,可以实现多个“特指”,实现的关键字不用“implement”,用“with”,实现多个“特指”,用多个“with”
- 定义类的时候,无论是继承类,还是实现“特指”,第一次必须用extends
- 重写非抽象的方法,需要在def前面加上override,否则报错。重写抽象方法,可以加override,也可以不加
在new实例的过程中,可以使用with动态实现一个接口
val person = new Person() with Speak