Scala类的继承(二)

34 阅读1分钟

带参构造器的写法

如果父类和子类都有自己的带参构造器,问题就比较复杂一些,我们在写子类的时候就要传入父类的构造器参数。

要点如下:

1. 父类构造器正常写。

2. 在写子类构造器时:

(1)如果某个属性可以从父类中继承过来,那么这些属性就不要添加任何的修饰符(val,var都不加)如果这属性是子类自己特有的,就需要补充修饰符;

(2)在父类构造器时,直接传入对应的参数。

代码演示:

正常写Animal类;

写Dog(var name:String) 时,程序就会报错。

package level02  
class Animal(var name:String, var age:Int){  
  println(s"父类的主构造器${name}, ${age}")  
}  
class Dog(name:String, age:Int,var weight:Int)  extends Animal(name,age){  
  println(s"子类的主构造${weight}")  
}  
object class009 {  
  def main(args: Array[String]): Unit = {  
    var d1 = new Dog("小白", 23,100)  
  }  
}

代码说明:

1. class Dog()中,参数name,age不需要添加var或者val。因为它继承Animal,所以它本身就有name,age属性。而weight需要添加var,它是子类的自己的属性。

2. Animal(name,age) 中, name, age的前面都没有添加修饰符。在子类构造函数调用的时候,就会执行这个函数,并进行参数传递。

改动代码如下:

package level02

object class009 {
  //当父类,子类都存在带有参数的构造器的时候,如何进行参数传递?
  //父类:name,age
  class Animal(val name:String,val age:Int) {
    println(s"父类构造器...${name} ${age}")

    def eat():Unit = {
      println(s"${name} ${age} eating.....")
    }
  }

  //子类:name,age,color
  class Dog(name:String,age:Int,var color:String) extends Animal(name,age){
    println(s"子类构造器... ${name}${age}${color}")
  }

  def main(args:Array[String]):Unit = {
    val dog1 = new Dog("旺财",1,"黑色")
    dog1.eat()
  }
}