12. 继承
class ScientificCalculator(name: String) extends Calculator(name) { def log(m: Double, base: Double) = math.log(m) / math.log(base) }
与Java的集成没区别,也是用 extends
。
注意: Scala类没有多继承,如:
class Student { val id: Int = 7 } class Teacher { val id: Int = 17 }
假设可以有:
class TeacherAssistant extends Student, Teacher { ... }
如果要求返回 id
时, 就没办法确定返回哪个的 id
。
13. 重载方法
class EvenMoreScientificCalculator(name: String) extends ScientificCalculator(name) { def log(m: Int): Double = log(m, math.exp(1)) }
方法重载指的是在一个类中定义多个同名的方法,但要求每个方法具有不同的参数类型
或参数个数
。
14. 抽象类
你可以定义一个抽象类,它定义了一些方法但没有实现它们。取而代之是由扩展抽象类的子类定义这些方法,你不能创建抽象类的实例。
// 定义抽象类 abstract class Shape { def getArea():Int // subclass should define this } // 扩展抽象类 class Circle(r: Int) extends Shape { def getArea():Int = { r * r * 3 } } val c = new Circle(2)
代码解释:定义了一个抽象类 Shape,里面定义了一个getArea的方法,但是没有实现它,而是定义了一个子类 Circle来继承 Shape 抽象类,然后在此子类中进行了 getArea 方法实现。
抽象类定义了一些没有实现的方法,而且抽象类无法被实例化,但可以由抽象类的子类来定义抽象类里面未实现的方法。
15. 特质
特质,是一些字段和行为的集合,可以扩展或混入(mixin)你的类中。不同于类继承,class 可以扩展多个 Traits,与Java中的接口类似。
trait Car { val brand: String } trait Shiny { val shineRefraction: Int } class BMW extends Car { val brand = "BMW" } val car = new BMW println(car.brand)
通过 with 关键字,一个类可以扩展多个特质:
class BMW extends Car with Shiny { val brand = "BMW" val shineRefraction = 12 }
BMW类继承了Car类,而且混入了 Shiny 类的特质,所以BMW类其实是有两种特点的。
16. 集合
Scala 提供了丰富的集合库,包括:列表(List)
、集合(Set)
、映射(Map)
、选项(Option)
、元组(Tuple)
:
scala> val x1 = List(1, 2, 3, 4, 5) x1: List[Int] = List(1, 2, 3, 4, 5) scala> println(x1) List(1, 2, 3, 4, 5) scala> val x2 = Set(1, 2, 3) x2: scala.collection.immutable.Set[Int] = Set(1, 2, 3) scala> println(x2) Set(1, 2, 3) scala> val x3 = Set(1, 2, 3, 3) x3: scala.collection.immutable.Set[Int] = Set(1, 2, 3) scala> println(x3) Set(1, 2, 3) scala> val x4 = Map("one" -> 1, "two" -> 2) x4: scala.collection.immutable.Map[String,Int] = Map(one -> 1, two -> scala> println(x4) Map(one -> 1, two -> 2) scala> val x5 = (2, "two") x5: (Int, String) = (2,two) scala> println(x5) (2,two) scala> val x6:Option[Int] = Some(5) x6: Option[Int] = Some(5) scala> println(x6) Some(5)
如果有编程基础,相信大家大概也能猜得到含义。此处主要解释Some和Option:
Option类型代表任意的值,多用在集合操作中,它可以存储任意类型的值,Option实例就是Some或者None对象实例。
Some和None都是它的子类,他们都是final类,所以不能再有派生子类了。
Option类型数据可以使用大部分的集合操作,Option数据存取其实是对Some对象的操作。
请参考此文章:Scala:Option、Some、None
Scala的其他集合操作详细教程请看:Scala常规操作之数组、List、Tuple、Set、Map
0xFF 总结
- Scala内容比较多,特别是各种各样的算子操作,需要多学习一下,但是入门写个HelloWorld其实此篇文章已经够用了。
- 最好大家有Java基础,因为很多内容都是相同的,包括入门大数据,个人也建议应该有个Java基础。