|
//有抽象方法或其它抽象成员的类就是抽象类,抽象类不能直接实例化,只能子类将抽象成员具体化之后才能实例化对象
object AbstractClassTest {
def main(args: Array[String]): Unit = {
val cat3 = new Cat3(2,"climb")
val dog3 = new Dog3("tom",3,"wangwang")
cat3.voice
dog3.voice
}
}
abstract class Animal3(val name:String) {
var age:Int
def voice():Unit
def this(name:String,age:Int) = {
this(name)
}
}
//抽象父类中有主构造和辅助构造函数,有具体类型字段或属性(name),也有抽象类型(age)
//辅助构造函数在第一句要用this(主构造器的参数列表)形式来调用主构造函数
//主构造传参形式,如果父类中字段不是抽象的,必须要用override (补充说明:如果Animal中var age:Int = 0定义为具体类型而不是
// var age:Int抽象类型也要在Dog的主构造的var age:Int前面加上override,从语法角度来理解的话,父类已经是有一个类型值放在那儿了,
// 你子类再对这个字段重新赋一个新值是不是要明确说明是override,否则就表示不声不响覆盖了父类的这个值)
class Dog3(override val name:String,var age:Int,var hobby:String) extends Animal3(name,age) {
override def voice(): Unit = println("Dog:" + name + " : " + age + " : " + hobby)
}
class Cat3(var age:Int,var hobby:String) extends Animal3("Jack") {
override def voice(): Unit = println("Cat:" + name + " : " + age +" : " + hobby)
}
显示如下:
Cat:Jack : 2 : climb
Dog:tom : 3 : wangwang
|
|