1.介绍scala面向对象2的时候先提下以下几点:
1.1 scala函数是指不依赖于类的,一旦依赖于类的时候,就叫方法,过程就是一个没有返回值的方法
1.2 scala中有类似于lazy级别的操作,lazy的变量在第一次使用时才会被实例化。spark中也有类似的操作,例如spark中Transformation类型的操作都是lazy的,不会触发job执行,Action级别的操作会触发job执行,这在后续的写spark博文时,我将跟大家一起分享和学习
1.3 类可以直接访问Object的成员,甚至时私有的成员
2.子类在继承超类的时候,不会继承超累的Object对象
3.scala 中override 即可复写父类的方法,有可以复写子类的属性,方法可以赋值给属性,属性也可以赋值给方法
4.isInstanceOf和asInstanceOf的区别
isInstanceOf:判断下是不是父类型
asInstanceOf[T] : 将对象强制转换成T类型
classOf[T]: 获取T的Class对象,返回类型的运行时呈现状态。这是一个存根方法,实际的实现是由编译器填补(自动生成)
5.trait:很多书上翻译成特质,实际上他就类似于java的Interface,区别在于trait的方法不一定是抽象方法,当trait中每个方法都是具体的方法的时候,trait就是一个工具类
6.Scala中使用with关键字来实现接口,但也有例外,trait的特殊性:
class SparkContext(config: SparkConf) extends Logging {
虽然Logging是trait,但是在scala的语法中,第一个继承的关键字必须是extends.
7.在scala中trait支持多重继承,但是类和抽象类是不支持多重继承的,即一个类可以继承多个trait,但是只能继承一个抽象类或具体类
8.Scala中有一个抽象属性或抽象成员
抽象属性:未被实例化的属性 val name:String 若定义抽象属性则必须定义类型,因为若不说明类型的话,编译的时候推导不出什么类型,子类中要直接进行赋值
9.Scala的类的实例对象也可以混入接口,当扩展当前对象的实例的功能
trait Logger {
def log(message:String) {
println("Logger: " + message)
}
}
trait RichLogger extends Logger {
override def log(message: String) {
println("RichLogger: " + message)
}
}
class Loggin(val name:String) extends Logger{
def logging {
println("Hi,welcome!" + name)
log(name)
}
}
object HelloTrait {
def main(args: Array[String]): Unit = {
val personLogin = new Loggin("DTSpark") with RichLogger
personLogin.logging
}
}
结果为:
/* -------------------------------- *
| Hi,welcome ! DTSpark |
| RichLogger: DTSpark |
* ------------------------------*/