scala中的面向对象编程

简介: scala中的面向对象编程

scala中的面向对象编程

Scala 是一种支持面向对象编程的语言。面向对象编程是一种编程范式,将数据和操作封装在称为对象的单元中。对象可以相互通信,以实现复杂的功能。

Scala 中的面向对象编程具有以下特点:

  • 类和对象

Scala 中的类和对象是面向对象编程的基础。类是对象的模板,对象是类的实例。类可以定义属性、方法和其他成员。

  • 继承

继承是面向对象编程的重要特性。继承允许一个类从另一个类继承属性和方法。

  • 多态性

多态性是面向对象编程的另一个重要特性。多态性允许一个变量引用不同类型的对象。

  • 抽象

抽象是面向对象编程的另一个重要特性。抽象允许定义不完整的类或对象。

Scala 中的面向对象编程与 Java 等其他面向对象语言类似。以下是 Scala 中面向对象编程的一些示例:

类和对象

以下代码定义了一个名为 Person 的类:

class Person(val name: String, val age: Int) {
  def sayHello(): Unit = {
    println(s"Hello, my name is $name.")
  }
}

该类定义了两个属性,nameage,以及一个方法,sayHello()

以下代码创建了一个名为 pPerson 对象:


val p = new Person("John Doe", 30)

我们可以使用 p 对象调用 sayHello() 方法:


p.sayHello() // Hello, my name is John Doe.

继承

以下代码定义了一个名为 Employee 的类,继承自 Person 类:

class Employee(name: String, age: Int, val salary: Double) extends Person(name, age) {
  def getSalary(): Double = salary
}

该类定义了一个额外的属性,salary

以下代码创建了一个名为 eEmployee 对象:


val e = new Employee("Jane Doe", 35, 100000.0)

我们可以使用 e 对象访问 salary 属性:


println(e.salary) // 100000.0

多态性

以下代码定义了一个函数 printNameAgeSalary(),该函数接受一个 Person 类型的参数:

def printNameAgeSalary(p: Person): Unit = {
  println(s"${p.name} is ${p.age} years old and earns ${p.salary}.")
}

我们可以将 Employee 类型的对象传递给 printNameAgeSalary() 函数:


printNameAgeSalary(e) // Jane Doe is 35 years old and earns 100000.0.

抽象

以下代码定义了一个名为 Shape 的抽象类:

abstract class Shape {
  def draw(): Unit
}

该类没有定义任何具体方法。

以下代码定义了一个名为 Circle 的类,继承自 Shape 类:

class Circle(val radius: Double) extends Shape {
  override def draw(): Unit = {
    println(s"Drawing a circle with radius ${radius}.")
  }
}

该类实现了 Shape 类的 draw() 方法。

以下代码创建了一个 Circle 对象:


val c = new Circle(10.0)

我们可以使用 c 对象调用 draw() 方法:


c.draw() // Drawing a circle with radius 10.0.

Scala 中的面向对象编程提供了一种强大的工具来组织代码和实现复杂的功能。

接口

Scala 中的 interface 类似于 Java 中的 interface,是一种抽象类,可以定义方法和属性。interface 不能直接实例化,但可以被类继承。

以下是 Scala 中定义 interface 的语法:

interface InterfaceName {
  // 方法定义
  // 属性定义
}

例如,以下代码定义了一个名为 Shape 的 interface:

interface Shape {
  def draw(): Unit
}

该 interface 定义了一个名为 draw() 的方法。

以下代码定义了一个名为 Circle 的类,继承自 Shape interface:

、class Circle(val radius: Double) extends Shape {
  override def draw(): Unit = {
    println(s"Drawing a circle with radius ${radius}.")
  }
}

该类实现了 Shape interface 的 draw() 方法。

Scala 中的 interface 可以使用 extends 关键字来扩展另一个 interface。例如,以下代码定义了一个名为 ColoredShape 的 interface,该 interface 扩展自 Shape interface:

interface ColoredShape extends Shape {
  val color: String
}

该 interface 定义了一个名为 color 的属性。

以下代码定义了一个名为 RedCircle 的类,继承自 ColoredShape interface:

class RedCircle(val radius: Double) extends ColoredShape {
  override val color: String = "red"

  override def draw(): Unit = {
    println(s"Drawing a red circle with radius ${radius}.")
  }
}

该类实现了 ColoredShape interface 的 color 属性和 draw() 方法。

Scala 中的 interface 可以用于实现多态性。例如,以下代码定义了一个函数 drawShape(),该函数接受一个 Shape 类型的参数:

def drawShape(shape: Shape): Unit = {
  shape.draw()
}

我们可以将 Circle 类型的对象传递给 drawShape() 函数:

val c = new Circle(10.0)
drawShape(c) // Drawing a circle with radius 10.0.

该函数将调用 Circle 对象的 draw() 方法。

抽象类

抽象类是指不能直接实例化的类,它可以定义属性、方法和其他成员。抽象类可以被其他类继承,子类必须实现抽象类中的所有抽象方法。

在 Scala 中,抽象类使用 abstract 关键字来定义。以下是 Scala 中定义抽象类的语法:

abstract class AbstractClass {
  // 属性定义
  // 方法定义
}

例如,以下代码定义了一个名为 Shape 的抽象类:

abstract class Shape {
  def draw(): Unit
}

该类定义了一个名为 draw() 的抽象方法。

以下代码定义了一个名为 Circle 的类,继承自 Shape 抽象类:

class Circle(val radius: Double) extends Shape {
  override def draw(): Unit = {
    println(s"Drawing a circle with radius ${radius}.")
  }
}

该类实现了 Shape 抽象类的 draw() 方法。

抽象类可以使用 extends 关键字来扩展另一个抽象类。例如,以下代码定义了一个名为 ColoredShape 的抽象类,该抽象类扩展自 Shape 抽象类:

abstract class ColoredShape extends Shape {
  val color: String
}

该类定义了一个名为 color 的抽象属性。

以下代码定义了一个名为 RedCircle 的类,继承自 ColoredShape 抽象类:

class RedCircle(val radius: Double) extends ColoredShape {
  override val color: String = "red"

  override def draw(): Unit = {
    println(s"Drawing a red circle with radius ${radius}.")
  }
}

该类实现了 ColoredShape 抽象类的 color 属性和 draw() 方法。

抽象类可以用于实现多态性。例如,以下代码定义了一个函数 drawShape(),该函数接受一个 Shape 类型的参数:

def drawShape(shape: Shape): Unit = {
  shape.draw()
}

我们可以将 Circle 类型的对象传递给 drawShape() 函数:

val c = new Circle(10.0)
drawShape(c) // Drawing a circle with radius 10.0.

该函数将调用 Circle 对象的 draw() 方法。

如何定义类

在 Scala 中,类是对象的模板,对象是类的实例。类可以定义属性、方法和其他成员。

以下是 Scala 中定义类的语法:

class ClassName {
  // 属性定义
  // 方法定义
}

例如,以下代码定义了一个名为 Person 的类:

class Person(val name: String, val age: Int) {
  def sayHello(): Unit = {
    println(s"Hello, my name is $name.")
  }
}

该类定义了两个属性,nameage,以及一个方法,sayHello()

以下代码创建了一个名为 pPerson 对象:


val p = new Person("John Doe", 30)

我们可以使用 p 对象调用 sayHello() 方法:


p.sayHello() // Hello, my name is John Doe.

类可以使用 extends 关键字来扩展另一个类。例如,以下代码定义了一个名为 Employee 的类,继承自 Person 类:

class Employee(name: String, age: Int, val salary: Double) extends Person(name, age) {
  def getSalary(): Double = salary
}

该类定义了一个额外的属性,salary

以下代码创建了一个名为 eEmployee 对象:

val e = new Employee("Jane Doe", 35, 100000.0)

我们可以使用 e 对象访问 salary 属性:

println(e.salary) // 100000.0

Scala 中的类可以使用 abstract 关键字来定义抽象类。抽象类不能直接实例化,但可以被其他类继承。例如,以下代码定义了一个名为 Shape 的抽象类:

abstract class Shape {
  def draw(): Unit
}

该类定义了一个名为 draw() 的抽象方法。

以下代码定义了一个名为 Circle 的类,继承自 Shape 抽象类:

class Circle(val radius: Double) extends Shape {
  override def draw(): Unit = {
    println(s"Drawing a circle with radius ${radius}.")
  }
}

该类实现了 Shape 抽象类的 draw() 方法。

Scala 中的类可以使用 sealed 关键字来定义密封类。密封类不能被外部类继承。例如,以下代码定义了一个名为 Color 的密封类:

sealed class Color {
  case object Red extends Color
  case object Green extends Color
  case object Blue extends Color
}

该类定义了三个密封子类,RedGreenBlue

Scala 中的类可以使用 enum 关键字来定义枚举类。枚举类可以用作常量。例如,以下代码定义了一个名为 Direction 的枚举类:

enum Direction {
  North,
  South,
  East,
  West
}

该类定义了四个枚举值,NorthSouthEastWest

类的继承

Scala 中类的继承方式与 Java 类似,使用 extends 关键字来定义。


class ClassName extends SuperClassName

例如,以下代码定义了一个名为 Employee 的类,继承自 Person 类:

class Employee(name: String, age: Int, val salary: Double) extends Person(name, age) {
  def getSalary(): Double = salary
}

该类继承了 Person 类的所有属性和方法,并添加了一个额外的属性 salary

Scala 中类的继承具有以下特点:

  • 子类可以访问父类的所有属性和方法,包括私有属性和方法。
  • 子类可以重写父类的方法。
  • 子类可以扩展父类的方法。

Scala 中类的继承可以用于实现多态性。例如,以下代码定义了一个函数 printNameAgeSalary(),该函数接受一个 Person 类型的参数:

def printNameAgeSalary(p: Person): Unit = {
  println(s"${p.name} is ${p.age} years old and earns ${p.salary}.")
}

我们可以将 Employee 类型的对象传递给 printNameAgeSalary() 函数:

val e = new Employee("Jane Doe", 35, 100000.0)
printNameAgeSalary(e) // Jane Doe is 35 years old and earns 100000.0.

该函数将调用 Employee 对象的 nameagesalary 属性,即使这些属性是从 Person 类继承而来的。

如何创建object对象

Scala 中使用 object 关键字来创建单例对象。单例对象是指只能创建一个实例的对象。

object ClassName {
  // 属性定义
  // 方法定义
}

例如,以下代码定义了一个名为 Counter 的单例对象:

object Counter {
  private var count = 0

  def increment(): Unit = {
    count += 1
  }

  def get(): Int = count
}

该对象定义了一个名为 count 的私有变量,用于记录计数器的值。它还定义了两个方法,increment()get()

我们可以使用 apply 方法来创建单例对象的实例。例如,以下代码创建了 Counter 对象的实例:


val counter = Counter

我们可以使用 increment() 方法来增加计数器的值:


counter.increment()

我们可以使用 get() 方法来获取计数器的值:


println(counter.get) // 1

单例对象可以用于实现全局状态和全局函数。例如,以下代码使用单例对象来实现一个计数器:

object Counter {
  private var count = 0

  def increment(): Unit = {
    count += 1
  }

  def get(): Int = count
}

def main(args: Array[String]): Unit = {
  println(Counter.get) // 0
  Counter.increment()
  println(Counter.get) // 1
}

该代码将打印以下输出:


0
1

obejct对象和类的区别

Scala 中的 object 对象和类有以下区别:

  • 对象是单例的,而类可以实例化多个对象。 对象只能创建一个实例,而类可以实例化多个对象。
  • 对象的属性和方法都是静态的,而类的属性和方法可以是静态的也可以是实例的。 对象的属性和方法都是静态的,也就是说,它们不需要创建对象就可以访问。类的属性和方法可以是静态的也可以是实例的,静态属性和方法不需要创建对象就可以访问,而实例属性和方法需要创建对象才能访问。
  • 对象可以用于实现全局状态和全局函数,而类通常用于表示数据结构和行为的封装。 对象可以用于实现全局状态和全局函数,因为对象是单例的,可以直接使用对象的名称来访问其属性和方法。类通常用于表示数据结构和行为的封装,因为类可以实例化多个对象,每个对象都有自己的状态和行为。

以下是一些例子来说明对象和类的区别:

  • 对象可以用于实现全局状态和全局函数。 例如,以下代码使用对象来实现一个计数器:
object Counter {
  private var count = 0

  def increment(): Unit = {
    count += 1
  }

  def get(): Int = count
}

该代码定义了一个名为 Counter 的对象,该对象定义了一个名为 count 的私有变量,用于记录计数器的值。它还定义了两个方法,increment()get()

我们可以使用 apply 方法来创建对象的实例。例如,以下代码创建了 Counter 对象的实例:


val counter = Counter

我们可以使用 increment() 方法来增加计数器的值:


counter.increment()

我们可以使用 get() 方法来获取计数器的值:


println(counter.get) // 1
  • 类通常用于表示数据结构和行为的封装。 例如,以下代码定义了一个名为 Person 的类:
class Person(val name: String, val age: Int) {
  def sayHello(): Unit = {
    println(s"Hello, my name is $name.")
  }
}

该类定义了两个属性,nameage,以及一个方法,sayHello()

我们可以使用 new 关键字来创建类的实例。例如,以下代码创建了 Person 类的实例:


val p = new Person("John Doe", 30)

我们可以使用 p 对象调用 sayHello() 方法:


p.sayHello() // Hello, my name is John Doe.
目录
相关文章
|
Java Scala
scala面向对象编程之类与对象
scala是支持面向对象的,也有类和对象的概念。 示例:定义一个User类,并添加成员变量/成员方法,创建一个Main object,添加一个main方法,并创建Customer类的对象,并给对象赋值,打印对象中的成员,调用成员方法
112 0
scala面向对象编程之类与对象
|
分布式计算 Java Scala
scala面向对象编程之继承
scala使用extends关键字来实现继承。可以在子类中定义父类中没有的字段和方法,或者重写父类的方法。 示例1:实现简单继承
161 0
scala面向对象编程之继承
|
Java Scala
scala面向对象编程之trait特质
特质就像是java的implement,是scala中代码复用的基础单元,它可以将方法和字段定义封装起来,然后添加到类中与类继承不一样的是,类继承要求每个类都只能继承一个超类,而一个类可以添加任意数量的特质。特质的定义和抽象类的定义很像,但它是使用trait关键字
117 0
scala面向对象编程之trait特质
|
分布式计算 前端开发 Scala
函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
函数式编程与面向对象编程[4]:Scala的类型关联Type Alias 之剑 2016.5.4 23:55:19 类型关联 Type Alias type关键字 scala里的类型,除了在定义class,trait,object时会产生类型,还可以通过type关键字来声明类型。
1038 0
|
前端开发 Java Scala
函数式编程与面向对象编程[3]:Scala的OOP-FP混合式编程与抽象代数理论
函数式编程与面向对象编程[3]:Scala的OOP-FP混合式编程与抽象代数理论 之剑 2016.5.4 23:55:19 Scala的设计哲学 Object-Oriented Meets Functional---当面向对象遇上函数式: Have the best of both worlds.
1333 0
|
Scala 调度 编译器
Scala第四章学习笔记(面向对象编程)
延迟构造 DelayedInit特质是为编译器提供的标记性的特质。整个构造器被包装成一个函数并传递给delayedInit方法。 trait DelayedInit { def deayedInit(x : Unit) : Unit } 这个方法接受一个函数对象,函数对象里...
867 0
|
1月前
|
分布式计算 大数据 Java
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
49 5
|
1月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
48 3
|
1月前
|
消息中间件 分布式计算 NoSQL
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
38 0
|
1月前
|
消息中间件 存储 分布式计算
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
75 0