class Person class Student extends Person val p: Person = new Student p match { //模式匹配 case per: Person => println("it's Person's object") case _ => println("unknown type") } // 運行後將會出現 「it's Person's object」 的字樣
class Person { protected var name: String = "0mifang" protected[this] var hobby: String = "game" } class Student extends Person { def sayHello = println("Hello, " + name) //沒法訪問到 hobby 變量,由於被 protected[this] 所保護 def makeFriends(s: Student) { println("my hobby is " + hobby + ", your hobby is " + s.hobby) } }
class Person(val name: String, val age: Int) //在主 constructor 中調用父類的 constructor class Student(name: String, age: Int, var score: Double) extends Person(name, age) { def this(name: String) { this(name, 0, 0) } def this(age: Int) { this("0mifang", age, 0) } }
匿名子類,也就是說,能夠定義一個類的沒有名稱的子類,並直接建立其對象,而後將對象的引用賦予一個變量。以後甚至能夠將該匿名子類的對象傳遞給其餘函數。編程
class Person(protected val name: String) { def sayHello = "Hello, I'm " + name } val p = new Person("0mifang") { //匿名內部類 override def sayHello = "Hi, I'm " + name } def greeting(p: Person { def sayHello: String }) { //使用匿名內部類做爲參數 println(p.sayHello) }
abstract class Person(val name: String) { def sayHello: Unit //無具體實現 } class Student(name: String) extends Person(name) { def sayHello: Unit = println("Hello, " + name) //覆蓋並作出具體實現 }
abstract class Person { val name: String //無初始值 } class Student extends Person { val name: String = "0mifang" //覆蓋並給出初始值 }
歡迎關注,本號將持續分享本人在編程路上的各類見聞。ide