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 }