多个trait加载顺序
package level2
object Sc79 {
trait A {
println("A")
}
trait BB {
println("BB")
}
trait B extends BB{
println("B")
}
trait CC {
println("CC")
}
trait C extends CC {
println("C")
}
class Class1 extends C with A with B {
println("Class1")
}
def main(args: Array[String]): Unit = {
new Class1()
}
}
多层trait加载顺序
package level2
object Sc79 {
trait A {
println("A")
}
trait BB {
println("BB")
}
trait B extends BB{
println("B")
}
trait CC {
println("CC")
}
trait C extends CC {
println("C")
}
class Class1 extends C with A with B {
println("Class1")
}
def main(args: Array[String]): Unit = {
new Class1()
}
}
空指针异常
package level2
import java.io.FileWriter
object Sc80 {
trait FileLogger {
println(2)
val filename: String
lazy val fileWriter = new FileWriter(filename, true)
def writeLog(msg: String): Unit = {
fileWriter.write(msg)
fileWriter.close()
}
}
class MyFileLogger extends FileLogger {
println(1)
val filename = "11-28.log"
}
def main(args: Array[String]): Unit = {
val fileLogger = new MyFileLogger()
fileLogger.writeLog("今天上午上scala课程")
}
}
trait与抽象类的区别
package level2
import java.io.FileWriter
object Sc81 {
object Person {
def test(p: Person): Unit = {
println(p.password)
}
}
class Person() {
var name: String = "xxx"
protected var birthday: String = "2000-10-10"
private var password: String = "123456"
private[this] var money: Int = 100
def t(): Unit = {
println(money)
}
}
class Son extends Person() {
println(birthday)
}
def main(args: Array[String]): Unit = {
val p1 = new Person()
println(p1.name)
new Son()
Person.test(p1)
}
}