特质: trait
- 实现多继承,注意观察父子类的构造器的执行顺序
- 先父后子。
- 有多个父类,按书写顺序从左向右执行!
package level02
object Class11 {
trait A {
println("A")
}
trait B {
println("B")
}
class Class1 extends A with B {
println("Class1")
}
def main(args: Array[String]): Unit = {
new Class1()
}
}
二.修改错误
- 演示一个程序错误
package level02
import java.io.FileWriter
object class12 {
// 在文件中写入日志
trait FileLogger {
// 抽象属性: 文件名
val filename: String
val fileWriter: FileWriter = new FileWriter(filename, true)
def writeLog(msg: String): Unit = {
fileWriter.write(msg)
fileWriter.close()
}
}
class MyFileLogger extends FileLogger {
val filename = "11-26.log"
}
def main(args: Array[String]): Unit = {
val fileLogger = new MyFileLogger()
fileLogger.writeLog("今天上午scala课程")
}
}
修改后
访问权限控制
- 公开的,不写修饰符
- protected 保护的 在类的外部不能访问 在子类中访问。
- private 私有的 在类的外部不能访问 在子类中不能访问 在伴生对象中可以访问!
- private[this] 只能被当前对象中使用 在类的内部使用
package level02
object class13 {
object Person {
def test(p: Person): Unit = {
// private 在伴生对象中可以访问!
println(p.password)
// private[this] 在伴生对象中不能访问的
// println(p.money)
}
class Person() {
var name: String = "xx" // 公开的
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 {
// 2. protected在子类中可访问
println(birthday)
// 3. private在子类中不可以访问的
// println(password)
}
def main(args: Array[String]): Unit = {
val p1 = new Person()
println(p1.name)
// 2. protected在类的外部无法访问
// println(p1.birthday)
new Son()
// 3. 在伴生对象中访问 类的私有成员
Person.test(p1)
}
}
}