天天看點

Scala語言入門二(對象)

講述Scala中的面向對象相關知識點

一、特征

  • 封裝:屬性和方法封裝在類中
  • 繼承:父類和子類的一個關系
  • 多态:父類引用指向子類對象

二、類的定義和使用

類是對象的抽象,而對象是類的具體執行個體。類是抽象的,不占用記憶體,而對象是具體的,占用存儲空間

/**
 * @author Gjing
 **/
class Person {
  // 定義屬性,Scala會自動幫var類型的屬性生成get、set,val類型的屬性生成get
  var name = ""
  val age = 10
  // 可通過下劃線作為一個占位符,使用占位符時就不允許使用val了
  var idCard: String = _

  def eat(): Unit = {

    println(name + "吃飯。。。")
  }
}

object Test {

  def main(args: Array[String]): Unit = {
    val person = new Person()
    person.name = "張三"
    person.idCard = "1234"
    person.eat()
    println(person.idCard)
  }
}           

三、主構造器與附屬構造器

/**
 * @author Gjing
 **/
class Men(name: String, age: Int) {
  // 定義屬性
  var userName: String = name
  var userAge: Int = age
  var idCard: String = ""

  // 附屬構造器
  def this(name: String, age: Int, idCard: String) {
    this(name, age)
    this.idCard = idCard
  }
}           

四、繼承

/**
 * @author Gjing
 **/
class Son(name: String, age: Int, val city: String) extends Men(name, age) {

}

object Test2 {
  def main(args: Array[String]): Unit = {
    val son = new Son("張三", 11, "廈門")
    println(son.city)
    println(son.userAge)
    println(son.userName)
  }
}           

五、重寫

重寫一個非抽象方法必須使用override修飾符;在子類中重寫超類的抽象方法時,你不需要使用override關鍵字

/**
 * @author Gjing
 **/
class Son(name: String, age: Int, val city: String) extends Men(name, age) {
  override def toString: String = s"Son($name,$age,$city)"
}           

六、抽象類

/**
 * @author Gjing
 **/
abstract class Food {
  def name():Unit
}

class Apple extends Food {
  def name(): Unit = {
    print("Apple")
  }
}           

七、伴生類和伴生對象

如果有一個class和一個同名的object,那麼就稱這個object是class的伴生對象,class是object的伴生類

/**
 * @author Gjing
 **/
class ApplyTest {
  def apply(): Unit = {
    println("Executor class apply...")
  }
}

object ApplyTest {
  // 最佳實踐,在object的apply方法去new class
  def apply(): ApplyTest = {
    println("Executor object apply...")
    new ApplyTest()
  }
}

object Test3 {
  def main(args: Array[String]): Unit = {
    // 直接通過類名加括号  是調用object中的apply方法
    val test = ApplyTest()
    // 對象加括号,是調用class中的apply方法
    test()
  }
}