7.scala面向对象2

来源:互联网 发布:淘宝卖家下架的宝贝在哪里 编辑:程序博客网 时间:2024/06/06 02:54

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  |
    * ------------------------------*/



0 0