class Person{ private val name = "CZM" def getName = name } class Student extends Person{ private val score = "A" def getScore = score override def getName = "My name is "+super.getName //重寫須要使用關鍵字override聲明。若是父類定義爲final則不可重寫 } val s1 = new Student s1.getScore s1.getName
//接上文代碼 //舊API,這個並不能精準判斷 val p1:Person = new Student if (p1.isInstanceOf[Student]){ val s1:Student = p1.asInstanceOf[Student] //p1的本質是沒有改變的,返回一個clone的對象 s1.getScore //若是不轉換,這個學生就失去了這個方法 } //新API,非精準判斷 p1 match { case _: Student => p1.asInstanceOf[Student] p1 case _ => }
val p1: Person = new Student val s1 = new Student p1.getClass == classOf[Student] //false p1.getClass == classOf[Person] //true
除了private以外,scala還提供和了protect關鍵字,子類訪問權限java
class Person() { protected[this] val name = "CZM" def getName = name } class Student extends Person { private val score = "A" def getScore = score def makeFriend(s: Student): Unit = { println("My name is " + name + " , I'm " + s.name + " is friend!") //在本身家能夠調用name,沒法調用s.name至關於本身兒子去了別人家 } } val s1 = new Student val s2 = new Student s1.makeFriend(s2)
//父類,定義了兩個constructor class Person(val name: String) { var age = 10 def getName = name def this(name: String, age: Int) { this(name) this.age = age } } //子類 定義本身的constructor(name:傳值,age:重寫父類中的age字段,score:定義本身的變量score) Person()這裏就決定了調用哪個constructor class Student(name: String, override val age: Int, val score: Double) extends Person(name) {
new 父類構造器( ) 或 接口( ) { //todo }
class Person(val name: String) { def sayHello = println("Person class " + name) } val p1 = new Person("CZM") //p1是一個Person類的對象 val p2 = new Person("leo") { //p2是一個Person類的匿名子類的對象 override def sayHello = println("new sun class " + name) } p1.sayHello p2.sayHello
//抽象類和抽象方法 abstract class Person { def sayHello():Any } class student extends Person{ override def sayHello() = ??? } //抽象類和抽象field abstract class Person { abstract val name:String }