Scala 编程基础 -- 类以及类的继承

Scala 类的继承特点:

    1.   Scala 是单继承

    2.  Scala 子类重写父类的非抽象方法,属性必须使用override 关键字

    3.  Scala 继承关键字extends

看一个例子:

class Point(val xc: Int, val yc: Int) {
   var x: Int = xc
   var y: Int = yc
   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("x 的坐标点 : " + x);
      println ("y 的坐标点 : " + y);
   }
}

class Location(override val xc: Int, override val yc: Int,
   val zc :Int) extends Point(xc, yc){
   var z: Int = zc

   def move(dx: Int, dy: Int, dz: Int) {
      x = x + dx
      y = y + dy
      z = z + dz
      println ("x 的坐标点 : " + x);
      println ("y 的坐标点 : " + y);
      println ("z 的坐标点 : " + z);
   }
}

object Test {
   def main(args: Array[String]) {
      val loc = new Location(10, 20, 15);

      // 移到一个新的位置
      loc.move(10, 10, 5);
   }
}

说明:

   1.  Locatoin 继续 Point  是单继承

   2. 在 new Location(10, 20, 15)时,

               2.1  10,与20率先传递给Point(10,  20)

              2.2  Location 中的 需要使用override 关键字,且必须是val

 3.  Location 中的move 与 Point中的move不是同一函数,所以Location中的move并不是重写父类Point中的move,其实是重载所以不用加 override关键字

 override 的理解: 即使是下面的情况也必须用override,因为Location传入的是Point的两个参数,必须用override关键字

class Point(val xc: Int, val yc: Int) {
   var x: Int = xc
   var y: Int = yc
}

class Location(override val xc: Int, override val yc: Int) extends Point(xc, yc){

}

 在看一个override 的例子,子类重写父类的属性:

class Day(val month: Int, val year: Int) {
    val name = "test"

  override def toString: String = name + "***"
}

class Date(override val month: Int, override val year: Int) extends Day(month, year) {
  override val name = "data"
}

object Test {
  def main(args: Array[String]) {
    val d = new Date(1, 2009)
    println (d)
  }
}

output:
 data***

说明:  Date子类,使用关键字override重写了父类的name 属性,调用 toString时name值已经被改写了.

          1. 如果父类Day中,  name是这样定义的  var name = "test",那么子类中就不必使用override关键字

           可以直接 name = "data"

         2. 构造器Day,Date 必须使用val,否则会报: Cannot override a mutable Variable Class 具体原因我后面在看看。

子类调用父类方法:

lass Day(val month: Int, val year: Int) {
    val name = "test"
  def get(u:Int):Int = {
     return u + 1
  }
  override def toString: String = name + "***"
}

class Date(override val month: Int, override val year: Int) extends Day(month, year) {
  override val name = "data"

  override def get(u: Int): Int = {
    val data = super.get(u)
    return data + 3
  }
}

object Test {
  def main(args: Array[String]) {
    val d = new Date(1, 2009)
    println (d.get(3))
  }
}

说明: 子类调用父类方法:  super.get(4) 

  一点要强调:  子类重写了父类的属性name后,子类中不能使用super.name调用父类的name

猜你喜欢

转载自blog.csdn.net/weixin_39594447/article/details/87827872