鍍金池/ 教程/ Scala/ Scala類和對(duì)象
Scala方法重載
Scala模式匹配
Scala throw關(guān)鍵字
Scala提取器
Scala概述
Scala throws關(guān)鍵字
Scala finally塊
Scala正則表達(dá)式
Scala循環(huán)語句
Scala多線程
Scala函數(shù)
Scala final關(guān)鍵字
Scala方法覆蓋
Scala字符串
Scala線程實(shí)現(xiàn)
Scala異常處理
Scala類和對(duì)象
Scala數(shù)據(jù)類型
Scala單例和伴生對(duì)象
Scala構(gòu)造函數(shù)
Scala教程
Scala Case類和對(duì)象
Scala繼承
Scala開發(fā)環(huán)境安裝配置
Scala運(yùn)算符
Scala文件I/O
Scala線程方法
Scala變量
Scala try-catch語句
Scala基礎(chǔ)語法
Scala集合
Scala數(shù)組
Scala閉包
Scala訪問修辭符
Scala this關(guān)鍵字

Scala類和對(duì)象

本章將介紹如何在Scala編程中使用類和對(duì)象。類是對(duì)象的藍(lán)圖(或叫模板)。定義一個(gè)類后,可以使用關(guān)鍵字new來創(chuàng)建一個(gè)類的對(duì)象。 通過對(duì)象可以使用定義的類的所有功能。

下面的圖通過一個(gè)包含成員變量(namerollNo)和成員方法(setName()setRollNo())的Student類的例子來演示類和對(duì)象。最后都是類的成員。類是一個(gè)模板的東西,而對(duì)象是真實(shí)存在的。 在下圖中,Student是一個(gè)類,而具體學(xué)生:Harini, John, 和 Maria 是學(xué)生類的對(duì)象,這此對(duì)象有是名字和注冊(cè)號(hào)。

類基礎(chǔ)

以下是在Scala中定義類的簡(jiǎn)單語法。這個(gè)類定義了兩個(gè)變量xy以及一個(gè)move方法,它沒有返回值。

使用類的名稱作為一個(gè)類構(gòu)造函數(shù),構(gòu)造函數(shù)可以使用多個(gè)參數(shù)。 上面的代碼定義了兩個(gè)構(gòu)造函數(shù)參數(shù)xcyc; 它們?cè)陬惖恼麄€(gè)定義中都是可見的。

語法

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 ("Point x location : " + x);
      println ("Point y location : " + y);
   }
}

如本章前面所述,您可以使用關(guān)鍵字new來創(chuàng)建對(duì)象,然后訪問類字段和方法,如下例所示:

import java.io._

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 ("Point x location : " + x);
      println ("Point y location : " + y);
   }
}

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

      // Move to a new location
      pt.move(10, 10);
   }
}

將上述程序保存在Demo.scala中,并使用以下命令編譯和執(zhí)行此程序。

D:\software\scala-2.12.3\bin>scalac Demo.scala

D:\software\scala-2.12.3\bin>scala Demo
Point x location : 20
Point y location : 30

D:\software\scala-2.12.3\bin>

擴(kuò)展類

在Scala中,我們可以擴(kuò)展一個(gè)Scala類,使用與Java中相同的方式設(shè)計(jì)繼承的類(使用extends關(guān)鍵字),但有兩個(gè)限制:方法重寫需要override關(guān)鍵字,只有主構(gòu)造函數(shù)可以通過參數(shù)調(diào)用基類構(gòu)造函數(shù)。讓我們擴(kuò)展上面的類,并增加一個(gè)類的方法。

例子

讓我們使用兩個(gè)類Point作為一個(gè)例子(與上面一樣)和Location類,Location類是一個(gè)使用extends關(guān)鍵字創(chuàng)建的繼承類。 這樣的“擴(kuò)展”子句有兩個(gè)效果:它使得Location類從Point類繼承所有非私有成員,并且使類型Location成為Point類類型的子類型。 所以Point類被稱為超類(父類),Location類被稱為子類。擴(kuò)展一個(gè)類并繼承父類的所有功能稱為繼承,但Scala允許只從一個(gè)類繼承(不支持多繼承)。

注意 - 在Point類中的move()方法和Location類中的move()方法不會(huì)覆蓋move的相應(yīng)定義,因?yàn)樗鼈兪遣煌亩x(例如,前者采用兩個(gè)參數(shù),后者采用三個(gè)參數(shù))。

參考以下示例程序來實(shí)現(xiàn)繼承 -

import java.io._

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 ("Point x location : " + x);
      println ("Point y location : " + 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 ("Point x location : " + x);
      println ("Point y location : " + y);
      println ("Point z location : " + z);
   }
}

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

      // Move to a new location
      loc.move(10, 10, 5);
   }
}

將上述程序保存在源文件:Demo.scala中,并使用以下命令編譯和執(zhí)行此程序,輸出結(jié)果如下 -

D:\software\scala-2.12.3\bin>scalac Demo.scala

D:\software\scala-2.12.3\bin>scala Demo
Point x location : 20
Point y location : 30
Point z location : 20

D:\software\scala-2.12.3\bin>

隱性類

當(dāng)類在范圍內(nèi)時(shí),隱式類允許與類的主構(gòu)造函數(shù)進(jìn)行隱式對(duì)話。隱式類是一個(gè)標(biāo)有'implicit'關(guān)鍵字的類。此功能在Scala 2.10中引入。

語法 - 以下是隱式類的語法。這里,隱式類始終位于對(duì)象范圍內(nèi),所有方法定義都被允許,因?yàn)殡[式類不能是頂級(jí)類。

語法

object <object name> {
   implicit class <class name>(<Variable>: Data type) {
      def <method>(): Unit =
   }
}

例子

下面演示如何使用隱式類,創(chuàng)建一個(gè)名稱為IntTimes的隱式類,并定義一個(gè)times()方法。times()包含一個(gè)循環(huán)事務(wù),它將按給定的次數(shù)執(zhí)行語句。假設(shè)要執(zhí)行4println(“”Hello“)語句。

以下是示例程序代碼。在這個(gè)例子中,使用了兩個(gè)對(duì)象類(RunDemo),將這兩個(gè)類保存在不同的文件中,名稱如下 -

Run.scala - 將以下程序保存在源文件:Run.scala

object Run {
   implicit class IntTimes(x: Int) {
      def times [A](f: =>A): Unit = {
         def loop(current: Int): Unit =

         if(current > 0){
            f
            loop(current - 1)
         }
         loop(x)
      }
   }
}

Demo.scala - 將以下程序保存在源文件:Demo.scala 中 -

import Run._

object Demo {
   def main(args: Array[String]) {
      4 times println("hello")
   }
}

用于以下命令編譯和執(zhí)行這兩個(gè)程序,輸出結(jié)果如下 -

D:\software\scala-2.12.3\bin>scalac Demo.scala

D:\software\scala-2.12.3\bin>scala Demo
hello
hello
hello
hello

D:\software\scala-2.12.3\bin>

-

  • 隱式類必須在另一個(gè)類/對(duì)象/特征中定義(不在頂層)。
  • 隱式類在其構(gòu)造函數(shù)中只能使用一個(gè)非默認(rèn)參數(shù)。
  • 隱式類作用域中不可以具有與隱式類相同名稱的的任何方法,成員或?qū)ο蟆?/li>

單例對(duì)象

Scala比Java更面向?qū)ο?,因?yàn)樵赟cala中不能擁有靜態(tài)成員,Scala它使用單例對(duì)象。單例是一種只能有一個(gè)實(shí)例的對(duì)象。使用object關(guān)鍵字對(duì)象而不是類關(guān)鍵字創(chuàng)建單例。由于無法實(shí)例化單例對(duì)象,因此無法將參數(shù)傳遞給主構(gòu)造函數(shù)。下面列出Scala使用單例對(duì)象的所有示例。

以下是實(shí)現(xiàn)單例的示例程序 -

import java.io._

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
   }
}

object Demo {
   def main(args: Array[String]) {
      val point = new Point(10, 20)
      printPoint

      def printPoint{
         println ("Point x location : " + point.x);
         println ("Point y location : " + point.y);
      }
   }
}

將上述程序保存在源文件:Demo.scala 中,使用以下命令編譯和執(zhí)行此程序,輸出結(jié)果如下 -

D:\software\scala-2.12.3\bin>scalac Demo.scala

D:\software\scala-2.12.3\bin>scala Demo
Point x location : 10
Point y location : 20

上一篇:Scala字符串下一篇:Scala線程方法