類和對象(十五)

簡介

  類是對象的抽象,而對象是類的具體實例。類是抽象的,不佔用內存,而對象是具體的,佔用存儲空間。類是用於創建對象的藍圖,它是一個定義包括在特定類型的對象中的方法和變量的軟件模板。

  Scala中的類不聲明爲public,一個Scala源文件中可以有多個類。

簡單實例

import java.io._

class Point(xc: Int, 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);
   }
}

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

      // 移到一個新的位置
      pt.move(10, 10);
   }
}

抽象類

  抽象類是一種不能被實例化的類,抽象類中包括了若干不能完整定義的方法,這些方法由子類去擴展定義自己的實現。

abstract class Animal {
  //抽象字段(域)
  //前面我們提到,一般類中定義字段的話必須初始化,而抽象類中則沒有這要求
  var height:Int
  //抽象方法
  def eat:Unit
}

//Person繼承Animal,對eat方法進行了實現
//通過主構造器對height參數進行了初始化
class Person(var height:Int) extends Animal{
  //對父類中的方法進行實現,注意這裏面可以不加override關鍵字
  def eat()={
    println("eat by mouth")
  }

}

//通過擴展App創建程序的入口
//App其實是一種trait,它幫助我們定義了main方法。
object Person extends App{
  new Person(10).eat()
}

繼承

簡介

  • 重寫一個非抽象方法必須使用override修飾符。
  • 重寫超類的抽象方法時,不需要使用override關鍵字。
  • 只有主構造函數纔可以往基類的構造函數裏寫參數。
  • 繼承會繼承父類的所有屬性和方法,Scala 只允許繼承一個父類。

簡單實例

class Point(xc: Int, 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

   override def move(dx: Int, dy: Int) {
       x = x - dx
       y = y - dy
       println ("x 的座標點: " + x)
       println ("y 的座標點: " + y)
   }

   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);
      loc.move(10, 10, 5);
   }
}

單例對象

簡介

  在Scala中,是沒有static的,但是提供了單例模式的實現方法,那就是使用關鍵字object。

  Scala中使用單例模式時,除了定義的類之外,還要定義一個同名的 object對象,它和類的區別是,object對象不能帶參數。

簡單實例

object Student {
  private var studentNo:Int=0;
  def uniqueStudentNo()={
    studentNo+=1
    studentNo
  }
  def main(args: Array[String]): Unit = {
    println(Student.uniqueStudentNo())
  }
}

伴生類與伴生對象

簡介

  當單例對象與某個類是同一個名稱時,單例對象被稱作是這個類的伴生對象,類被稱爲是這個單例對象的伴生類。必須在同一個源文件裏定義伴生類和伴生對象。它們可以互相訪問其私有成員。

簡單實例

class Student(var name:String,var age:Int){
  private var sex:Int=0
  //直接訪問伴生對象的私有成員
  def printCompanionObject()=println(Student.studentNo)
}

object Student {
  private var studentNo:Int=0;
  def uniqueStudentNo()={
    studentNo+=1
    studentNo
  }
  def main(args: Array[String]): Unit = {
    println(Student.uniqueStudentNo())
    val s=new Student("john",29)
    //直接訪問伴生類Student中的私有成員
    println(s.sex)
  }
}

匿名類

  當某個類在程序中只使用一次時,可以將類定義爲匿名類。

//抽象的Person類
abstract class Person(name:String,age:Int){ 
  def walk():Unit
}


object demo{
  def main(args: Array[String]): Unit = {
     //下面的代碼定義了一個匿名類,並且進行了實例化
     //直接new Person("john",18),後面跟的是類的內容
     //我們知道,Person是一個抽象類,它是不能被實例化的
     //這裏能夠直接new操作是因爲我們擴展了Person類,只不
     //過這個類是匿名的,只能使用一次而已
     val s=new Person("john",18){
       override def walk()={
         println("Walk like a normal Person")
       }
     }
     s.walk()   
  }
}

多態與動態綁定

簡介

  多態(Polymorphic)也叫動態綁定(Dynamic Binding)、遲綁定(Late Binding),指在執行期間(而非編譯期間)判斷所引用對象的實際類型,根據其實際類型調用其相應的方法。子類的引用可以賦給父類。

簡單實例

//抽象Person類
abstract class Person(var name:String,var age:Int){

  def walk():Unit
  //talkTo方法,參數爲Person類型
  def talkTo(p:Person):Unit
}

class Student(name:String,age:Int) extends Person(name,age){
  private var studentNo:Int=0
  def walk()=println("walk like a elegant swan")
  //重寫父類的talkTo方法
  def talkTo(p:Person)={
    println("talkTo() method in Student")
    println(this.name+" is talking to "+p.name)
  }
}

class Teacher(name:String,age:Int) extends Person(name,age){
  private var teacherNo:Int=0

  def walk()=println("walk like a elegant swan")

   //重寫父類的talkTo方法
  def talkTo(p:Person)={
    println("talkTo() method in Teacher")
    println(this.name+" is talking to "+p.name)
  }
}

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

     //下面的兩行代碼演示了多態的使用
     //Person類的引用可以指向Person類的任何子類
     val p1:Person=new Teacher("albert",38)
     val p2:Person=new Student("john",38)

     //下面的兩行代碼演示了動態綁定
     //talkTo方法參數類型爲Person類型
     //p1.talkTo(p2)傳入的實際類型是Student
     //p2.talkTo(p1)傳入的實際類型是Teacher
     //程序會根據實際類型調用對應的不同子類中的talkTo()方法
     p1.talkTo(p2)
     p2.talkTo(p1)
  }
}

忠於技術,熱愛分享。歡迎關注公衆號:java大數據編程,瞭解更多技術內容。

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章