抽象类
trait
可以理解为可以带有具体方法实现的接口类
trait Logger{ //trait相当于接口
def log(msg:String){
prinln("log " + msg)
}
}
class Test extends Logger{
def test{
log("xxx")
}
}
//使用
object Basic3 extends App{
val t = new Test //产生一个对象
t.test //调用对象的方法
}
含有抽象方法的trait
trait Logger{
def log(msf : String) //抽象方法
}
trait ConsoleLogger extends Logger{
def log(msg : String){
println(msg)
}
}
class Test extends ConsoleLogger{
def test{
log("PPP")
}
}
//使用
object Basic3 extends App{
val t = new Test
t.test
}
抽象类和trait类(接口类)
trait ConsoleLogger{
def log(msg: String){
println("save money : "+ msg)
}
}
- trait MessageLogger extends ConsoleLogger{
- override def log(msg:String){
- println("save money to bank:" + msg)
- }
- }
abstract class Account{
def save
}
class MyAccount extends Account with ConsoleLogger{
def save{
log("100")
}
}
//使用
object Basic3 extends App{
val
acc = new MyAccount with MessageLogger //定义一个带有特质的对象,trait为特质的意思,用with表示带有什么特质- acc.save
}
在object中使用apply方法
class ApplyTest{
def test{
println("test")
}
}
object ApplyTest{ //在object中定义的方法相当一静态方法
def apply() = new ApplyTest
def fun1{
println("this is a static method")
}
}
//类的框架
class Basic4{
}
object Basic4 extends App{
val a = ApplyTest() //注意,等号右边没有new关键字,调用ApplyTest对象时实际调用的是ApplyTest对象中的apply方法,然后把apply的返回值给a
a.test
}
//结果输出为
test
在class中使用apply方法
class ApplyTest{
def apply() = "APPLY"
def test{
println("test")
}
}
object ApplyTest{
def apply() = new ApplyTest
def fun1{
println("this is a static function")
}
}
class Basic4{
}
object Basic4 extends App{
val t = new ApplyTest
println(t()) //t()表示调用t对象中的apply方法
}
总结:
类名加括号调用的是object中的apply方法 ,如 val a = ApplyTest()
对象名加括号调用的是类中的apply方法, 如 t()
在一个代码块中导入包,出了这个快,就不起作用了
{
import xx.xxx.xyz
}
重命名引入成员
//例如,将util包中的hashMap类重命名为JavaHashMap
import java.util.(HashMap => JavaHashMap)
隐藏
//例如隐藏HashMap
HashMap => _
自动引入
//例如,引入java.lang中的所有类
java.lang._