第10章 继承
10.1 继承类
class Person { var name = "" }
class Employee extends Person { var salary = 0.0 def description = "An employee with name " + name + " and salary " + salary }
提示:
10.2 重写方法
class Person { var name = "" override def toString = getClass.getName + "[name=" + name + "]" }
class Employee extends Person { var salary = 0.0 override def toString = super.toString + "[salary=" + salary + "]" }
10.3 类型检查和转换
1)classOf[String] 就如同 Java 得 String.class
2)obj.isInstanceOf[T] 就如同 Java 的 Obj isInstanceof T
3)obj.asInstanceOf[T] 就如同 Java 的 (T)Obj
println("Hello".isInstanceOf[String]) println("Hello".asInstanceOf[String]) println(classOf[String])
10.4 受保护的字段和方法
protected 在 Scala 中比 Java 要更严格一点,即,只有继承关系才可以访问,同一个包下时不可以的。
10.5 超类的构造
类有一个主构造器和任意数量的辅助构造器,而每个辅助构造器都必须以对先前定义的辅助构造器
或主构造器的调用开始。子类的辅助构造器最终都会调用著构造器,只有主构造器可以调用超类的
构造器。辅助构造器永远都不可能直接调用超类的构造器。在Scala的构造器中,你不能调用 super(params).
** 当前类的【辅助构造器】,最终都会调用当前类的【主构造器】
** 子类的主构造器,最终都会调用父类的构造器(可以是辅助构造器,可以是主构造器)
class Dog(age: Int){
def this(){
this(10)
}
} val dog = new Dog(20) val dog = new Dog()
class Person(val name: String, val age: Int) { override def toString = getClass.getName + "[name=" + name + ",age=" + age + "]" }
class Employee(name: String, age: Int, val salary : Double) extends Person(name, age) { override def toString = super.toString + "[salary=" + salary + "]" }
10.6 重写字段(覆写字段)
class Person1(val name: String, var age: Int) { println("主构造器已经被调用") val school = "五道口职业技术学院" def sleep = "8 hours" override def toString: String = "我的学校是:" + school + ",我的名字:" + name + ",我的年龄:" + age }
class Person2(name: String, age: Int) extends Person1(name, age){
override val school: String = "清华大学"
}
调用:
//覆写字段 val person = new Person2("nick", 20) println(person) //主构造器已经被调用 //我的学校是:清华大学,我的名字:nick,我的年龄:20
尖叫提示:
1、def 只能重写另一个 def
2、val 只能重写另一个 val 或不带参数的 def 不能重写 var
3、var 只能重写一个抽象的 var
val a = "123" //不能被 def 重写 def a = "123" //不带参数的 def 可以被 val 重写
什么是抽象 var?
sbstract class Person3{
var name: String //这就是一个抽象的var
}
10.7 匿名子类
class Person(val name: String) { override def toString = getClass.getName + "[name=" + name + "]" }
使用: val alien = new Person("Fred") { def greeting = "Greetings, Earthling! My name is Fred." }
println(alien.greeting)
10.8 抽象类
abstract class Person(val pname: String) { val id: Int // No initializer—this is an abstract field with an abstract getter method var name: String // Another abstract field, with abstract getter and setter methods def idString: Int // No method body—this is an abstract method }
class Employee(pname: String) extends Person(pname) { val id = 5; var name = ">>>" def idString = pname.hashCode // override keyword not required }
10.9 构造顺序和提前定义
class Creature { val range: Int = 10 val env: Array[Int] = new Array[Int](range) }
class Ant extends Creature { override val range = 2 }
class Ant2 extends { override val range = 3 } with Creature
笔记:
class Creature { val range: Int = 10 val env: Array[Int] = new Array[Int](range) } class Ant extends Creature { override val range = 20 } class Ant2 extends { override val range = 20 } with Creature
调用:
val ant = new Ant println(ant.range) //20 println(ant.env.length) //0 val ant2 = new Ant2 println(ant2.range) //20 println(ant2.env.length) //20
10.10 Scala 继承层级
在scala中,所有其他类都是AnyRef的子类,类似Java的Object。
AnyVal和AnyRef都扩展自Any类。Any类是跟节点
Any中定义了isInstanceOf、asInstanceOf方法,以及哈希方法等。
Null类型的唯一实例就是null对象。可以将null赋值给任何引用(AnyRef),但不能赋值给值类型(AnyVal)的变量。
Nothing类型没有实例。它对于泛型结构是有用处的,举例:空列表Nil的类型是List[Nothing],它是List[T]的子类型,T可以是任何类。
::Nil 这是产生一个新的集合,不是在原有基础上追加