#单例对象
对象的构造器在该对象第一次被使用时调用
#伴生对象
当一个单例对象存在同名类的时候,成为伴生对象
class HELLOWORLD{...}
object HELLWORLD{...}
类和伴生对象可以互相访问私有属性,但是必须存在同一个源文件中
类的伴生对象可以被访问,但并不在作用域中
apply方法:未细讲
练习:
编写一个Time类,加入私有属性hours和minutes
加入方法get,查询hours,minutes的值,并输出(hours,minutes)
加入方法do,min自增1,若min=60时置为0,且hour增1,若hours=24,时,置为0
Time对象的构造形式为new Time(h,min), h,min 均为Int,且 0<=h<23, 0<=min<59
class Time{
private var hours=0
private var minutes=0
def get() {println(hours,minutes)}
def get_h() {println(hours)}
def get_min() {println(minutes)}
def do1() {
minutes +=10
if(minutes==60){
minutes=0
hours+=1
if(hours==24){
hours=0
}
}
}
}
#拓展(继承)
class week extends month{...}
继承所有非私有成员
子类可以重写超类的成员
#单例对象可以从类中继承
object day extends week{...}
#重写
override
class week extends month{
override def firstday = {...}
}
class week (override val lastday:String) extends month{...}
超类的修改不会检查子类。
##重写规则:
###重写def:
> 用val: 可以重写超类没有参数的方法(getter)
> def: 重名即可
> var: 同时重写getter、setter方法,只重写getter方法就报错
###重写val
> val: 重名 getter方法重写超类的getter方法
###重写var
> var: 且当超类的var是抽象的才能被重写,否则超类的var都会被继承
###举例
class month{
val one = 25 //可在子类用val重写
val tow = 15 //不可用var重写,不是抽象的
var three:Int //可用var重写
def firstday = //可在子类用val重写
def now = //可在子类用var重写, now,now_一起重写
def now_=
def lastday(m:Char)={} //可用def重写
}
总结:
子类中,def只能重写def 。 val 可以重写val或者不带参数的def, var只能重写抽象的var或者超类的getter/setter对
#抽象
# 不能被实例的类叫做抽象类
abstract year{
val name:Array[String]
var num:Int
def sign
}
#保护
当一个类不希望被继承、拓展时,可在类声明前加上final保留字
#构造
先运行超类构造器,再运行子类构造器
class month {
val num = 31
val day = new Array[Int](num)}
class extends month {
overide val num = 7 }
val a = new week ##注意: 结果是num=7, day的长度为0
#解决办法:
> 将超类的val 声明为 final #不够灵活
> 将超类的val声明为laze #暂不初始化。 效率偏低
> 子类中使用提前定义的语法
class week extends (override val num = 7} with month {...}
#scala特质
trait reset{
def reset(m:Int,n:Int)=if(m>n) 1 }
class week extends reset with B with C{...}
所有java接口都可以当做特质使用在scala中
构造从左到右
>超类
>父特质
>第一个特质
>第二个特质(父特质不重复构造)
>类
右侧胜出
浙公网安备 33010602011771号