- Scala Tutorial
- Scala - Home
- Scala - Overview
- Scala - Environment Setup
- Scala - Basic Syntax
- Scala - Data Types
- Scala - Variables
- Scala - Classes & Objects
- Scala - Access Modifiers
- Scala - Operators
- Scala - IF ELSE
- Scala - Loop Statements
- Scala - Functions
- Scala - Closures
- Scala - Strings
- Scala - Arrays
- Scala - Collections
- Scala - Traits
- Scala - Pattern Matching
- Scala - Regular Expressions
- Scala - Exception Handling
- Scala - Extractors
- Scala - Files I/O
- Scala Useful Resources
- Scala - Quick Guide
- Scala - Useful Resources
- Scala - Discussion
Scala - 类和对象
本章将带您了解如何在 Scala 编程中使用类和对象。类是对象的蓝图。定义类后,您可以使用关键字new从类蓝图中创建对象。通过该对象,您可以使用已定义类的所有功能。
下图以student类为例演示了类和对象,其中包含成员变量(name和roll no)和成员方法(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类是使用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 次 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。您可以使用关键字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