Scala教程之:面向对象的scala
文章目錄
- 面向對象的scala
- Unified Types
- Classes
- Traits
面向對象的scala
我們知道Scala是一種JVM語言,可以合java無縫銜接,這也就大大的擴展了scala的應用范圍,大數據里面有名的spark就是使用scala編寫的,那么scala到底有什么奧秘和特性呢?我們一一來揭秘。
首先scala是一門面向對象的編程語言,他的面向對象性主要表現在如下幾個方面:
- Unified Types
- Classes
- Traits
下面我們分別的說明他們各自的特定。
Unified Types
在Scala中,是沒有java里面那些基礎類型的,所有的Scala類型我們都可以稱之為type,下面是一個類型層次結構的子集:
我們可以看到Any是所有類型的父類型,所有的類型都是直接或者間接繼承Any來的。 Any提供了一些通用的方法比如:equals、hashCode和toString。 Any有兩個直接的子類:AnyVal和AnyRef.
AnyVal表示的是值類型,它有9個預定義的非空的值類型分別是:Double、Float、Long、Int、Short、Byte、Char、Unit和Boolean。
其中Unit是一個比較特別的類型。可以把他看成java里面的void。因為Scala中所有的函數必須要有返回類型,當一個函數實在沒有返回的時候,就用Unit吧。
AnyRef表示的是引用類型。所有的非值的類型都是引用類型。并且所有的用戶自定義類型都是AnyRef類型的子類。在Java環境中,AnyRef相當于Java里面的java.lang.Object。
值類型可以按照下面的方式進行轉換:
下面是轉換的例子:
val x: Long = 987654321 val y: Float = x // 9.8765434E8 (note that some precision is lost in this case)val face: Char = '?' val number: Int = face // 9786Nothing是所有類型的子類,它通常被用來表示非正常終止的信號,比如拋出異常,程序退出等等。
Null是所有引用類型的子類型,Null主要是用來跟JVM交互使用的,通常不需要在Scala中使用到它。
Classes
Classes就是類,和java中的類相似,它里面可以包含方法、常量、變量、類型、對象、特質、類等。
一個最簡的類的定義就是關鍵字class+標識符,類名首字母應大寫。如下所示:
class Familyval family = new Familynew關鍵字是用來創建類的實例。在上面的例子中,Family沒有定義構造器,所以默認帶有一個無參的默認的構造器。
- 構造器
那么怎么給類加一個構造器呢?
class Point(var x: Int, var y: Int) {override def toString: String =s"($x, $y)" }val point1 = new Point(2, 3) point1.x // 2 println(point1) // prints (2, 3)和其他的編程語言不同的是,Scala的類構造器定義在類的簽名中:(var x: Int, var y: Int)。 這里我們還重寫了AnyRef里面的toString方法。
構造器也可以擁有默認值:
class Point(var x: Int = 0, var y: Int = 0)val origin = new Point // x and y are both set to 0 val point1 = new Point(1) println(point1.x) // prints 1主構造方法中帶有val和var的參數是公有的。然而由于val是不可變的,所以不能像下面這樣去使用。
class Point(val x: Int, val y: Int) val point = new Point(1, 2) point.x = 3 // <-- does not compile不帶val或var的參數是私有的,僅在類中可見。
class Point(x: Int, y: Int) val point = new Point(1, 2) point.x // <-- does not compile- 私有成員和Getter/Setter語法
Scala的成員默認是public的。如果想讓其變成私有的,可以加上private修飾符,Scala的getter和setter語法和java不太一樣,下面我們來舉個例子:
class Point {private var _x = 0private var _y = 0private val bound = 100def x = _xdef x_= (newValue: Int): Unit = {if (newValue < bound) _x = newValue else printWarning}def y = _ydef y_= (newValue: Int): Unit = {if (newValue < bound) _y = newValue else printWarning}private def printWarning = println("WARNING: Out of bounds") }object Point {def main(args: Array[String]): Unit = {val point1 = new Pointpoint1.x = 99point1.y = 101 // prints the warning} }我們定義了兩個私有變量_x, _y, 同時還定義了他們的get方法x和y,那么相應的他們的set方法就是x_ 和y_, 在get方法后面加上下劃線就可以了。
這里我們還定義了一個Point的伴生對象,用于啟動main方法。有關伴生對象的概念我們后面會詳細講訴。
Traits
特質 (Traits) 用于在類 (Class)之間共享程序接口 (Interface)和字段 (Fields)。 它們類似于Java 8的接口。 類和對象 (Objects)可以擴展特質,但是特質不能被實例化,因此特質沒有參數。
- 定義Traits
最簡化的特質就是關鍵字trait+標識符:
trait HelloWorld特征作為泛型類型和抽象方法非常有用。
trait Iterator[A] {def hasNext: Booleandef next(): A }擴展 trait Iterator [A] 需要一個類型 A 和實現方法hasNext和next。
- 使用Traits
使用 extends 關鍵字來擴展特征。然后使用 override 關鍵字來實現trait里面的任何抽象成員:
trait Iterator[A] {def hasNext: Booleandef next(): A }class IntIterator(to: Int) extends Iterator[Int] {private var current = 0override def hasNext: Boolean = current < tooverride def next(): Int = {if (hasNext) {val t = currentcurrent += 1t} else 0} }val iterator = new IntIterator(10) iterator.next() // returns 0 iterator.next() // returns 1- 子類型
和java一樣,所有需要用到Traits的地方都可以用他的子類型代替。
import scala.collection.mutable.ArrayBuffertrait Pet {val name: String }class Cat(val name: String) extends Pet class Dog(val name: String) extends Petval dog = new Dog("Harry") val cat = new Cat("Sally")val animals = ArrayBuffer.empty[Pet] animals.append(dog) animals.append(cat) animals.foreach(pet => println(pet.name)) // Prints Harry Sally這里animals需要的是Pet類型,我們可以用dog和cat代替。
更多精彩內容且看:
- 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
- Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
- Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
- java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程
更多教程請參考 flydean的博客
總結
以上是生活随笔為你收集整理的Scala教程之:面向对象的scala的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Libra教程之:move语言的特点和例
- 下一篇: Scala教程之:Scala基础