面向对象编程——类
在scala中定义一个类,类中有一个成员变量age。系统默认会生成一个无参的主构造器
成员变量的getter和setter方法 getter方法就叫age,setter方法叫age_
1、
定义不带
private
的
var
字段, 此时
scala
生成的面向
JVM
的类时, 会定义为
private
的
name
字段, 并提供
public
的
getter
和
setter
方法
2、
而如果使用
private
修饰字段, 则生成的
getter
和
setter
也是
private
的3、如果定义 val 字段, 则只会生成 getter 方法,因为常量值不可更改,所以没有setter方法
4、如果不希望生成 setter 和 getter 方法, 则将字段声明为 private[this]
private修饰的myAge可以被类的当前对象和类的其他对象访问。但是由private[this]修饰的myAge不会生成getter和setter方法,只能被类的当前对象访问而不能被类的其他对象访问
辅助constructor
Scala
中, 可以给类定义多个辅助
constructor
, 类似于
Java
中的构造函数重载
辅助 constructor 之间可以互相调用, 而且必须第一行调用主 constructor
辅助 constructor 之间可以互相调用, 而且必须第一行调用主 constructor
主构造器与类同名,他的参数可以放在类名后面,在类中,如果某些代码不在任何方法中,或者不在代码块中,那么这些代码就会被默认为主构造器的代码
面向对象编程——对象
object相当于class的单个实例。在第一次调用object的方法时,就会执行object的constructor
object不能定义有参的constructor。object的constructor只会在第一次被调用时执行一次
伴生对象、伴生类
如果有一个class和一个与class同名的object,那么就称这个object是这个类的伴生对象,这个类就是这个object的伴生类
1、必须放在同一个scala文件中。
2、伴生类与伴生对象之间可以互相访问private成员
在类中调用伴生对象的方法,直接通过伴生对象.方法名调用
在伴生对象中调用类的方法,可以通过创建一个伴生类的对象来调用伴生类中的方法
apply方法
object
中非常重要的一个特殊方法, 就是
apply
方法
通常在伴生对象中实现 apply 方法, 并在其中实现构造伴生类的对象的功能
而创建伴生类的对象时, 通常不会使用 new Class 的方式, 而是使用 Class() 的方式, 隐式地调
用伴生对象的 apply 方法, 这样会让对象创建更加简洁
通常在伴生对象中实现 apply 方法, 并在其中实现构造伴生类的对象的功能
而创建伴生类的对象时, 通常不会使用 new Class 的方式, 而是使用 Class() 的方式, 隐式地调
用伴生对象的 apply 方法, 这样会让对象创建更加简洁
isinstanceOf和asinstanceOf
用object来实现枚举功能
如果要实现枚举, 则需要用
object
继承
Enumeration
类, 并且调用
Value
方法
来初始化枚举值
还可以通过
Value
传入枚举值的
id
和
name
, 通过
id
和
toString
可以获取; 还可以通过
id
和
name
来查找枚举值
main方法
scala中的main方法必须定义在object中。Object类相当于java中的静态类
除了写main方法之外,还可以通过继承App这个trait,实现和main相同的功能
object也可以extends抽象类,并重写抽象类中的方法,使用关键字override
面向对象编程——继承
Scala中的继承和Java中一样,也使用extends关键字
子类重写父类的方法,使用关键字override
子类调用父类中已被子类重写的方法,使用关键字super
不仅仅是方法可以被override 定义为val的常量也可以在子类中override,并给赋予新的值
类型转换和类型判断
在scala中,使用isInstanceOf来判断是否为子类 a.isInstanceOf[B] 判断对象a是否为B类型或者B类的子类型
使用asInstanceOf来完成类型转换 如果a是B类型或者B的子类型,就可以安全地把a赋给B类型的对象b b=a.asInstanceOf(B)
通过对象.getClass()方法可以获得该对象所属的类classOf[类名]可以精准地获得类
访问修饰符
private、private[this]、protect、protect[this]
如果使用
protected[this]
, 则只能在当前子类对象中访问父类的字段和方法, 无法通过其他子类对象访问父类的
字段和方法
如果使用
protected[this]
, 则只能在当前类对象中访问类的字段和方法, 无法通过该类的对象访问
面向对象编程——trait
trait可以作为接口来使用,但是不适用implements 而是使用extends
scala
不支持对类进行多继承, 但是
支持多重继承
trait
,
使用
with
关键字即可
trait中可自定义字段和方法(抽象方法和抽象方法均可)
如果是在类中实现trait中的抽象方法,不用关键字override
trait中也可以定义字段,如果一个类extends了这个trait,name这个类就自动获得了这个字段,可以在类中直接使用,
就像是自己内部声明的一样
混入trait
在创建类的对象时, 指定该对象混入某个
trait
, 这样, 就只有这个对象混入该
trait
的方法, 而类的其他对象则有。
此时,混入的trait如果有和该类继承的trait相同的方法,将会覆盖本身的方法
trait调用链
要形成trait调用链,必须满足以下三个条件:
1、调用链必须是一个类继承多个trait
2、多个trait中必须包含同一个方法,并且多个trait有一个共同的父trait
3、调用的多个trait的同一个方法中,最后的语句必须是super.方法名,通过这种形式调用trait调用链中的下一个trait方法
满足以上条件才能构成trait调用链,在调用链中按照从右往左的顺序依次调用同一个方法。
trait的构造机制
继承了
trait
的类的构造机制如下:
1 、 父类的构造函数执行,类本身的构造器最后执行;
2 、 trait 的构造代码执行, 多个 trait 从左到右依次执行;
3 、 构造 trait 时会先构造父 trait , 如果多个 trait 继承同一个父 trait , 则父 trait 只会构造一次;
4 、 所有 trait 构造完毕之后, 子类的构造函数执行
1 、 父类的构造函数执行,类本身的构造器最后执行;
2 、 trait 的构造代码执行, 多个 trait 从左到右依次执行;
3 、 构造 trait 时会先构造父 trait , 如果多个 trait 继承同一个父 trait , 则父 trait 只会构造一次;
4 、 所有 trait 构造完毕之后, 子类的构造函数执行
trait也可以继承类
在
Scala
中,
trait
也可以继承自
class
, 此时这个
class
就会成为所有继承该
trait
的类的父类