本章将向您介绍如何在Scala编程中使用类和对象.类是对象的蓝图.定义类后,可以使用关键字 new 从类蓝图创建对象.通过该对象,您可以使用已定义类的所有功能.
下图通过以类student为例演示类和对象,其中包含成员变量(名称和滚动否) )和成员方法(setName()和setRollNo()).最后所有人都是班上的成员.类是蓝色打印,对象在这里是真实的.在下图中,Student是一个类,Harini,John和Maria是Student类的对象,它们具有名称和roll-number.
以下是在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 关键字),但有两个限制:方法重写需要覆盖关键字,只有主要构造函数可以将参数传递给基础构造函数.让我们扩展上面的类并添加一个类方法.
让我们举两个类Point类的例子(作为相同的例子)如上所述)和Location类是使用extends关键字继承的类.这样的' extends '子句有两个作用:它使Location类从Point类继承所有非私有成员,并使类型 Location 成为类型
注意 : 方法类中的move()方法和位置类中的 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
当类在范围内时,隐式类允许与类的主构造函数进行隐式对话.隐式类是标有"隐式"关键字的类.此功能在Scala 2.10中引入.
语法 : 以下是隐式类的语法.这里隐式类总是在允许所有方法定义的对象范围内,因为隐式类不能是顶级类.
object <object name> { implicit class <class name>(<Variable>: Data type) { def <method>(): Unit = } }
让我们举一个带有方法times()的名为 IntTimes 的隐式类的示例.这意味着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演示
你好 你好 你好 你好
注意 :
必须在另一个类/对象/特征内定义隐式类(不是在顶层).
隐式类在构造函数中只能接受一个非隐式参数.
隐式类可能不是范围内与隐式类同名的任何方法,成员或对象.
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