继承
子类extends 父类
package com.ruozedata.bigdata.scala03
//父类
class Person {
var name : String =_
var age :Int = _
}
package com.ruozedata.bigdata.scala03
//子类
class Student extends Person{
//name继承自父类,study是子类独有的方法
def study(course : String)=print(name+"在学习")
}
object Student{
def main(args: Array[String]): Unit = {
val student = new Student()
student.name="zhangsan"
student.study("math")
}
}
继承就代表子类可继承父类的field和method,然后子类还可以在自己的内部拥有自己的field和method。
在Scala中的继承:
1、private 修饰的field和method不可以被子类继承,职能在类的内部使用
2、使用final修饰符时,修饰类:类不能被继承;修饰filed和method:可以被继承,不能被重写
override的使用场景
1、Scala中,如果子类要重写父类中的一个非抽象方法,必须要使用override关键字。
2、子类可以覆盖父类中val修饰的field,只要在子类中使用override关键字即可。(注意:父类中var修饰的field,子类不能覆写)
继承中的constructor
创建子类对象时,会自动调用子类响应的构造器:
1、调用子类主构造器
2、调用子类辅构造器,辅构造器会再去调用主构造器。
创建子类对象时,会先去调用父类的构造器:子类主构造器去调用父类zhong的构造器。
Scala中的抽象类
如果在父类中,有某些方法无法立即实现,而需要依赖不用的子类来覆盖,重写实现不同的方法。此时,可以将父类中的这些方法编写成只有含方法声明,不含方法体的形式。
一个类中,如果有一个抽象方法或抽象field,就必须使用abstract将类声明为抽象类,该类是不可被实例化的,而是通过子类(不能还是抽象的)来new。
trait
Scala中不能多继承
如果想多继承,就使用trait。scala不支持对类进行多继承,但是支持多重继承trait,使用with关键字即可。
trait中:可以定义抽象方法外还可以定义属性和方法的实现:抽象字段,具体字段,具体方法,抽象方法。
!!当类继承多个trait时,而这些trait中都共有同一个方法,那么子类调用时到底执行哪个trait中的方法? 首先会从最右边的trait的方法开始执行。
高阶函数
**map函数:**对传入的每个元素都进行映射,返回一个处理后的元素
List l = List(1,2,3,4,5,6,7,8,9)
l.map(_*10)//List里的每个元素*10 精简写法
l.map(el=>el+10) list里的每一个元素+10
filter函数:
对每个元素进行条件判断,true则保留,否则过滤
l.map(*2).filter(_>10)//大于10的所有元素
l.map(*2).filter(_>10).take(2) 表示取前面的2个
reduce():
两两操作
l.reduce(+)
fold()
初始值
l.fold(10).(+)
count()
l.count(_>3)
flatten
val a = List(List(1,2),List(3,4),List(5,6))
a.flatten ⇒ List(1,2,3,4,5,6)
flatMap ⇒ flatten+map
a.flatMap(.map(*2))
⇒ List(2,4,6,8,10,12)
val lines = ......
hello world hello
hello world welcome
hello
val words = lines.flatMap(_.split("\t"))
hello
world
hello
hello
world
welcome
hello