Scala类和对象– Singleton对象,伴侣类

时间:2020-02-23 14:41:45  来源:igfitidea点击:

Scala是一种面向对象的功能编程语言,因此今天我们将简要介绍一下Scala类和对象。

Scala类和对象

可以将类定义为静态模板,可以在运行时从中实例化许多对象。

让我们看一下如何在Scala中定义类的示例;

class Student() {
 	var total:Int = 0
 	def calculateTotal(ma1:Int,ma2:Int) {
 	total = ma1 + ma2
 	}
 	override def toString(): String = "(" + total + ")";
}

其中我们使用关键字" class"定义一个名为" Student"的类。
然后,我们声明一个变量total并将变量值初始化为零。
方法" calculateTotal"由参数ma1和ma2定义,参数ma1和ma2是两个主题的单独分数/得分。
分数相加,总计被计算并存储在" total"变量中。

我们将重写toString标准方法,以便在打印它时,我们可以获得有用的信息。
下图显示了它在Scala终端中的外观。

现在,我们将通过创建Student类的对象来测试该方法,如下所示。

object Stud1 {
	def main(args:Array[String]) {
	val totalMarks = new Student()
	totalMarks.calculateTotal(55,60)
	println("Grand Total Marks of the Student is"+totalMarks)
}
}

Stud1是Student类的对象。
我们使用String类型数组作为参数定义main方法。
我们使用new关键字将totalMarks创建为Student类的实例,并调用传递标记的calculateTotal方法并打印受保护的总标记。

请注意,应定义main方法,因为它是程序执行的入口点。

现在通过调用Stud1的主要方法来运行以上代码:

scala>Stud1.main(null)
Total Marks secured by the Student is(115)

在Scala中,我们将必须明确指定null作为参数,因为它是一种功能语言,并且所有函数都接受参数。
下图显示了创建对象并在Scala shell中执行它。

在Scala中扩展程序

可以扩展与Java类似的基类,但有两个限制,即只有子类的主构造函数可以将参数传递给基类构造函数,并且必须指定override关键字。

考虑重写基类方法的示例;

class Student(val m1:Int,val m2:Int) {
 	var total:Int = m1 + m2
	var ma1:Int = m1
	var ma2:Int = m2
 	def calculateTotal(ma1:Int,ma2:Int) {
 	total = ma1 + ma2
	println("Total is :"+total)
 	}
 	override def toString(): String = "(" + total + ")";
 }

学生是基类,它具有一个calculateTotal方法,该方法接受两个主题的分数并输出总分数。

现在,我们将创建一个扩展Student类的子类,该子类将四个主题的分数相加并计算总计,如下所示。

class CollegeStudent(override val m1:Int,override val m2:Int,val m3:Int,val m4:Int) extends Student(m1,m2) {
	var ma3:Int = m3
	var ma4:Int = m4
	var tot:Int = 0;
 	def calculateTotal( ma1:Int, ma2:Int, ma3:Int,  ma4:Int) {
	tot = ma1 + ma2 + ma3+ ma4
	println("Total is :"+tot)
	}
	override def toString():String = "(" + tot + ")";
}

我们将" override"关键字添加到变量m1和m2。
关键字" extends"用于扩展基类Student。
但是由于实现具有不同的定义,因此不会覆盖该方法。

创建一个CollegeStudent类的对象ColStud作为;

object ColStud {
def main(args:Array[String]) {
val total = new CollegeStudent(72,65,85,60);
total.calculateTotal(72,65,85,60);
println("Grand Total Marks of the Student is"+total)
}
}

通过执行以下命令运行以上代码;

scala> ColStud.main(null)
Total is :282
Grand Total Marks of the Student is(282)

Scala中的Singleton对象

Scala中没有static关键字,相反,我们有单例对象。
我们需要做的就是使用object关键字创建一个单例对象。
我们可以直接调用它的方法,我们不能将参数传递给它的主要构造函数。
下面是Scala中单例对象的快速示例。

object Test{
  def say(){
  println("Hi")
}
}

下图显示了如何执行上面定义的方法,请注意它与Java静态方法执行的相似程度。

Scala库中的内置对象

Scala库中有许多内置对象,其中之一是Console对象,它读取值并在终端上打印。

让我们考虑一个Console对象的例子。

object Cons {
def main(args:Array[String]) = {
  Console.println("Enter a number :");
  val num = Console.readInt;
  Console.println("Entered Number is :"+num)
  }
}

我们正在创建一个Cons对象。
在主要方法中,我们要求用户输入一个数字,并使用readInt从终端读取输入的数字并打印输入的数字。

运行代码,如下所示

>Cons.main(null)
Enter a number :
Entered Number is :345

Scala弃用模式

下图显示了在Scala shell中定义Cons对象时发生的情况。

注意警告"有一个弃用警告;请使用-deprecation重新运行以获取详细信息"。
它不会告诉我们引起该警告的行号,但是已定义了对象。
但是,使用不推荐使用的方法不是一个好主意。
因此,我们可以使用-deprecation选项运行Scala shell,它可以提供有用的信息来对其进行更正。
下图显示了它的作用。

Scala中的伴侣类和对象

与类对象同名的对象是伴随对象,该类称为伴随类。
例如;

class Student(sid:Int, sname:String){
val Id = sid
val name = sname
 
override def toString() =
this.Id+" "+" , "+this.name
}

其中我们创建一个以sid和sname作为参数的Student类,并显示这些参数。

使用displayDetails方法创建一个与学生同名的对象,我们将其中打印学生的详细信息。
该Student对象被称为伴随对象,因为它与该类具有相同的名称,并且Student类被称为Companion类。

object Student{
def displaydetails(st: Student){
println("Student Details: " + st.Id+","+st.name);
}
}

现在创建testStud对象,以调用这些伴随对象和类的方法,如下所示;

object testStud {
 
def main(args: Array[String]) = {
  
var st = new Student(21,"Peter")
println(st)
  
Student.displaydetails(st)
}
}

其中我们正在打印学生对象,并通过传递学生对象st来调用displaydetails方法。

将以上代码作为testStud.main(null)运行,将产生以下输出;

scala> testStud.main(null)
21  , Peter
Student Details: 21,Peter

如果您查看上面的图像,您会注意到警告,因为"先前定义的类Student不是对象Student的同伴。
伙伴必须一起定义;您可能希望使用:paste模式。
"

请注意,建议您使用粘贴模式,下图显示了如何使用粘贴模式来避免此警告。

Scala编译器

在结束本文之前,我想向您展示如何在Scala中编译和运行类。
如果您注意到上面的示例,我正在使用Scala shell创建类并使用它,但是一旦关闭它,我的代码就会丢失。
因此,我们可以将Scala程序保存在扩展名为.scala的文件中,然后编译并运行它。

Test.scala

object Test{
	def main(args: Array[String]) = {
	println("Welcome to theitroad!")
	}
}

这与用Java编译和运行类非常相似,如下面的Shell执行代码所示。

hyman:~ hyman$scalac Test.scala 
hyman:~ hyman$scala Test
Welcome to theitroad!

您会注意到在编译Test类时创建了一个名为Test.class的文件。