7.scala面向对象2

本文深入探讨Scala面向对象编程的核心概念,包括函数与方法的区别、lazy操作的特点、trait的运用方式及其与Java接口的不同之处。此外,还介绍了Scala中类与trait的继承机制,以及抽象属性的使用方法。

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



### Scala 面向对象编程概念 #### 类与对象 在Scala中,类是创建对象的蓝图。通过定义类来封装数据和操作这些数据的方法[^1]。 ```scala class Person(val name: String, val age: Int) { def introduce(): Unit = println(s"Name is $name and Age is $age") } ``` 上述代码展示了如何定义一个`Person`类,并为其提供了一个名为`introduce()`的方法用于自我介绍。 对于单例模式的支持,Scala提供了特殊的语法糖——`object`关键字用来声明单例对象。这使得编写工具函数变得非常方便。 ```scala object MathUtil { def add(a: Int, b: Int): Int = a + b } println(MathUtil.add(3, 5)) ``` 这里展示的是一个简单的加法计算工具类`MathUtil`作为单例存在。 #### 特质(Trait) 特质类似于其他语言里的接口,但是更加强大因为它可以包含具体实现。可以通过`with`关键字将多个特质组合在一起赋予某个特定类型的实例上[^4]。 ```scala trait Logger { def log(message: String): Unit = println(s"[LOG]:$message") } val userLogger = new AnyRef with Logger userLogger.log("User logged in.") ``` 这段代码说明了怎样利用特质为任意类型添加日志记录功能而无需修改原有结构。 #### 继承机制 当涉及到继承关系时,子类可以在其主构造器里显式调用超类(即父类)的构造器完成初始化工作;而在Java里面则是隐式的处理方式[^5]。 ```scala class Employee(name: String, age: Int, private var salary: Double) extends Person(name, age){ override def toString: String = super.toString + s"\nSalary=$salary" } val emp = new Employee("Alice", 27, 60000) emp.introduce() println(emp) ``` 此部分演示了员工类扩展自人员基类的过程以及覆盖toString方法来自定义字符串表示形式。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值