- Scala 教程
- Scala - 首页
- Scala - 概述
- Scala - 特性
- Scala - 环境搭建
- Scala - 构建工具 (SBT)
- Scala - 基本语法
- 数据类型和变量
- Scala - 数据类型
- Scala - 变量
- Scala - 字符串
- Scala - 数组
- Scala 运算符
- Scala - 运算符
- Scala - 算术运算符
- Scala - 关系运算符
- Scala - 逻辑运算符
- Scala - 位运算符
- Scala - 赋值运算符
- Scala 条件语句
- Scala - IF ELSE
- Scala 循环语句
- Scala - 循环语句
- Scala - while 循环
- Scala - do-while 循环
- Scala - for 循环
- Scala - break 语句
- Scala 类与对象
- Scala - 类与对象
- Scala - 访问修饰符
- Scala 方法与函数
- Scala - 函数
- Scala - 按名称调用函数
- Scala - 带命名参数的函数
- Scala - 带可变参数的函数
- Scala - 递归函数
- Scala - 默认参数值
- Scala - 高阶函数
- Scala - 嵌套函数
- Scala - 匿名函数
- 部分应用函数
- Scala - 柯里化函数
- Scala 集合
- Scala - 集合
- Scala - 列表
- Scala - 集合
- Scala - 映射
- Scala - 元组
- Scala - 迭代器
- Scala - 选项
- Scala 模式匹配
- Scala - 模式匹配
- Scala - 异常处理
- Scala - 提取器
- Scala - 正则表达式
- Scala 文件 I/O
- Scala - 文件 I/O
- Scala 高级概念
- Scala - 闭包
- Scala - 特质
- Scala 有用资源
- Scala - 快速指南
- Scala - 在线编译器
- Scala - 有用资源
- Scala - 讨论
Scala - 类与对象
本章将引导您了解如何在 Scala 编程中使用类和对象。类是对象的蓝图。定义类后,可以使用关键字new从类蓝图创建对象。通过对象,您可以使用已定义类的所有功能。
下图通过以 Student 类为例演示了类和对象,该类包含成员变量(姓名和学号)和成员方法(setName() 和 setRollNo())。最终,所有这些都是类的成员。类是蓝图,对象是现实。在下图中,Student 是一个类,Harini、John 和 Maria 是 Student 类的对象,它们都具有姓名和学号。
基本类
以下是定义 Scala 中基本类的简单语法。此类定义了两个变量x和y以及一个方法:move,它不返回值。类变量称为类的字段,方法称为类方法。
类名充当类构造函数,它可以接受多个参数。以上代码定义了两个构造函数参数xc和yc;它们在类的整个主体中都可见。
语法
class Point(xc: Int, yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("Point x location : " + x); println ("Point y location : " + y); } }
如本章前面所述,您可以使用关键字new创建对象,然后可以访问类字段和方法,如下面的示例所示:
示例
import java.io._ class Point(val xc: Int, val yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("Point x location : " + x); println ("Point y location : " + y); } } object Demo { def main(args: Array[String]) { val pt = new Point(10, 20); // Move to a new location pt.move(10, 10); } }
将上述程序保存到Demo.scala中。以下命令用于编译和执行此程序。
命令
\>scalac Demo.scala \>scala Demo
输出
Point x location : 20 Point y location : 30
扩展类
您可以扩展基本 Scala 类,并且可以像在 Java 中一样设计继承类(使用extends关键字),但有两个限制:方法重写需要override关键字,并且只有主构造函数可以将参数传递给基构造函数。让我们扩展我们上面的类并添加另一个类方法。
示例
让我们以两个类 Point 类(与上面相同的示例)和 Location 类为例,Location 类使用 extends 关键字继承类。这样的“extends”子句有两个作用:它使 Location 类继承 Point 类中的所有非私有成员,并且它使类型Location成为类型Point类的子类型。所以这里 Point 类称为超类,类Location称为子类。扩展类并继承父类的所有功能称为继承,但 Scala 仅允许从一个类继承。
注意- Point 类中的 move() 方法和Location 类中的 move() 方法没有覆盖 move 的相应定义,因为它们是不同的定义(例如,前者接受两个参数,而后者接受三个参数)。
尝试以下示例程序来实现继承。
import java.io._ class Point(val xc: Int, val yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("Point x location : " + x); println ("Point y location : " + y); } } class Location(override val xc: Int, override val yc: Int, val zc :Int) extends Point(xc, yc){ var z: Int = zc def move(dx: Int, dy: Int, dz: Int) { x = x + dx y = y + dy z = z + dz println ("Point x location : " + x); println ("Point y location : " + y); println ("Point z location : " + z); } } object Demo { def main(args: Array[String]) { val loc = new Location(10, 20, 15); // Move to a new location loc.move(10, 10, 5); } }
将上述程序保存到Demo.scala中。以下命令用于编译和执行此程序。
命令
\>scalac Demo.scala \>scala Demo
输出
Point x location : 20 Point y location : 30 Point z location : 20
隐式类
隐式类允许在类在范围内时使用类的主要构造函数进行隐式转换。隐式类是在类中使用“implicit”关键字标记的类。此功能是在 Scala 2.10 中引入的。
语法- 以下是隐式类的语法。这里隐式类始终位于对象范围内,其中允许所有方法定义,因为隐式类不能是顶级类。
语法
object <object name> { implicit class <class name>(<Variable>: Data type) { def <method>(): Unit = } }
示例
让我们以一个名为IntTimes的隐式类为例,其中包含方法 times()。这意味着 times() 包含一个循环事务,该事务将执行给定语句指定的次数。假设给定语句是“4 times println (“Hello”)”,这意味着 println (“”Hello”) 语句将执行 4 次。
以下是给定示例的程序。在此示例中使用了两个对象类(Run 和 Demo),因此我们必须将这两个类保存到不同的文件中,并分别使用以下名称命名。
Run.scala- 将以下程序保存到 Run.scala 中。
object Run { implicit class IntTimes(x: Int) { def times [A](f: =>A): Unit = { def loop(current: Int): Unit = if(current > 0){ f loop(current - 1) } loop(x) } } }
Demo.scala- 将以下程序保存到 Demo.scala 中。
import Run._ object Demo { def main(args: Array[String]) { 4 times println("hello") } }
以下命令用于编译和执行这两个程序。
命令
\>scalac Run.scala \>scalac Demo.scala \>scala Demo
输出
Hello Hello Hello Hello
注意-
隐式类必须定义在另一个类/对象/特质中(而不是在顶级)。
隐式类在其构造函数中只能接受一个非隐式参数。
隐式类不能是范围内与隐式类同名的任何方法、成员或对象。
单例对象
Scala 比 Java 更面向对象,因为在 Scala 中,我们不能拥有静态成员。相反,Scala 具有单例对象。单例是一个只能有一个实例的类,即对象。您可以使用关键字object而不是 class 关键字来创建单例。由于您不能实例化单例对象,因此您不能将参数传递给主构造函数。您已经看到了所有使用单例对象的示例,其中您调用了 Scala 的 main 方法。
以下是实现单例的相同示例程序。
示例
import java.io._ class Point(val xc: Int, val yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy } } object Demo { def main(args: Array[String]) { val point = new Point(10, 20) printPoint def printPoint{ println ("Point x location : " + point.x); println ("Point y location : " + point.y); } } }
将上述程序保存到Demo.scala中。以下命令用于编译和执行此程序。
命令
\>scalac Demo.scala \>scala Demo
输出
Point x location : 10 Point y location : 20