Scala学习笔记-4-组合和继承

package day05

object Demo {

  def main(args: Array[String]): Unit = {

    // 原则上 Scala 的函数调用中可以省略所有的空括号。
    "hello".length()
    "hello".length
  }
}

// Scala 也允许你使用 var 关键字来定义参数化成员变量,使用 var 定义的成员变量,可以重新赋值
// 此外 Scala 也允许你使用 private,protected,override 来修饰参数化成员变量,和你定义普通的成员变量的用法一样。
class Demo {
  val name = "zhangsan"
  var age = 12
  private val favorite = "game"
  protected def show(): Unit = println(favorite)
}

// 无参数方法
abstract class Element1 {
  def contents: Array[String]
  def height: Int = contents.length
  def  Int = if (height == 0) 0 else contents(0).length
}

// 空括号方法
abstract class Element2 {
  def contents(): Array[String]
  def height(): Int = contents.length
  def width(): Int = if (height == 0) 0 else contents()(0).length
}

// 也可以用成员变量定义
// 效果是等价的,唯一的差别是使用成员变量的方法调用速度要快些,因为字段值在类被初始化的时候被预计算,而方法调用在每次调用的时候都要计算。
abstract class Element3 {
  def contents: Array[String]
  val height: Int = contents.length
  val  Int = if (height == 0) 0 else contents(0).length
}

// 可以使用成员变量来重载一个不带参数的成员函数。
class MyElement1(array: Array[String]) extends Element1 {
  override val contents: Array[String] = array
}

// 无论是无参数方法还是空括号方法都可以这样
class MyElement2(array: Array[String]) extends Element2 {
  override val contents: Array[String] = array
}

// Scala 支持使用参数化成员变量,也就是把参数和成员变量定义合并到一起(合并到类变量里面)
class MyElement3(val contents: Array[String]) extends Element3

// 调用基类构造函数
// 继承带参数的类时需要向基类传递参数
class MyElement3Ext1(s: String) extends MyElement3(Array(s))
// 也可以直接向基类中填写参数
class MyElement3Ext2(s: String) extends MyElement3(new Array[String](0))

// 多态和动态绑定:调用哪个类型的方法取决于运行时变量当前的类型,而不是定义变量的类型。(和 Java 一样,略)

// 定义 final 成员(和 Java 一样,略)

// 使用组合还是继承
// 继承是is a 的关系(Student is a Person):MyElement1 与 Element1 属于继承关系
// 组合是has a的关系(one person has a head):MyElement1 与 Array 属于组合关系(组合是指一个类持有另一个类的引用,借助引用完成任务。感觉就是一个成员变量)
原文地址:https://www.cnblogs.com/CSunShine/p/11974735.html