当前位置: 首页 > 文档资料 > Scala 中文文档 >

类和对象( Classes & Objects)

优质
小牛编辑
129浏览
2023-12-01

本章将向您介绍如何在Scala编程中使用类和对象。 类是对象的蓝图。 定义类后,可以使用关键字new从类蓝图创建对象。 通过该对象,您可以使用已定义类的所有功能。

下图以类student为例演示了类和对象,其中包含成员变量(name和roll no)和成员方法(setName()和setRollNo())。 最后所有人都是班上的成员。 类是蓝色打印,对象在这里是真实的。 在下图中,Student是一个类,Harini,John和Maria是Student类的对象,它们具有名称和roll-number。

Scala类和对象

基础班

以下是在Scala中定义基本类的简单语法。 此类定义了两个变量xy以及一个方法: move ,它不返回值。 调用类变量,类的字段和方法称为类方法。

类名作为类构造函数,可以使用许多参数。 上面的代码定义了两个构造函数参数, xcyc ; 它们在全班同学中都可见。

语法 (Syntax)

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创建对象,然后您可以访问类字段和方法,如下例所示 -

例子 (Example)

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 。 以下命令用于编译和执行此程序。

Command

\>scalac Demo.scala
\>scala Demo

输出 (Output)

Point x location : 20
Point y location : 30

扩展课程

您可以扩展基础Scala类,并且可以像在Java中一样设计继承类(使用extends关键字),但有两个限制:方法重写需要override关键字,并且只有primary构造函数可以通过基础构造函数的参数。 让我们扩展上面的类并添加一个类方法。

例子 (Example)

让我们举两个类Point类的例子(与上面相同的例子)和Location类是使用extends关键字继承的类。 这样的' extends '子句有两个作用:它使Location类从Point类继承所有非私有成员,并使类型Location成为Point类的子类型。 因此,Point类称为superclass ,类Location称为subclass 。 扩展类并继承父类的所有功能称为inheritance但Scala仅允许从一个类继承。

Note - Point类中的方法move()方法和move() method in Location class不会覆盖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 。 以下命令用于编译和执行此程序。

Command

\>scalac Demo.scala
\>scala Demo

输出 (Output)

Point x location : 20
Point y location : 30
Point z location : 20

隐式类

当类在范围内时,隐式类允许与类的主构造函数进行隐式对话。 隐式类是标有“隐式”关键字的类。 Scala 2.10中引入了此功能。

Syntax - 以下是隐式类的语法。 这里隐式类总是在允许所有方法定义的对象范围内,因为隐式类不能是顶级类。

语法 (Syntax)

object <object name> {
   implicit class <class name>(<Variable>: Data type) {
      def <method>(): Unit =
   }
}

例子 (Example)

让我们举一个名为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")
   }
}

以下命令用于编译和执行这两个程序。

Command

\>scalac Run.scala
\>scalac Demo.scala
\>scala Demo

输出 (Output)

Hello
Hello
Hello
Hello

Note -

  • 隐式类必须在另一个类/对象/特征内定义(不在顶层)。

  • 隐式类只能在其构造函数中使用一个非隐式参数。

  • 隐式类可能不是范围内与隐式类同名的任何方法,成员或对象。

单身对象

Scala比Java更面向对象,因为在Scala中,我们不能拥有静态成员。 相反,Scala具有singleton objects 。 单例是一个只能有一个实例的类,即Object。 您可以使用关键字object而不是class关键字创建单例。 由于无法实例化单例对象,因此无法将参数传递给主构造函数。 您已经看过使用单个对象的所有示例,其中您调用了Scala的main方法。

以下是实现单例的相同示例程序。

例子 (Example)

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 。 以下命令用于编译和执行此程序。

Command

\>scalac Demo.scala
\>scala Demo

输出 (Output)

Point x location : 10
Point y location : 20