本文介绍Scala中的对象object。
1、基本知识
1.1 什么是Scala中的单例对象?
单例,单例,顾名思义,它只有一个实例,没有更多了。这就是它区别于class类的地方。
Scala是一种面向对象的编程语言,常量/变量/方法等必须要定义在class或object里面才行,在其他之外的地方是不能被定义的。就是说object对象、class类是唯二可定义其成员的地方。
定义对象的关键字是object,它是一个实例,不是一个蓝图,因此它不需要外部调用即可执行其方法。
和惰性变量一样,单例对象是延迟创建的,当它第一次被使用时创建。
当然可以创建多个单例对象,也可以在类或方法中定义对象,自然也可以在一个对象或类中引用另一个对象中的方法或常量。如果要在一个脚本中引用另一个脚本中的对象的方法,则需要import进来对象的路径。
注意:一个单例对象是全局唯一的,所以具有稳定路径。即你不能创建两个同样名称的对象,不再同一个路径也不行,任何地方都不行。
1.2 为什么选择单例对象?
每个程序都需要一个从执行开始的点。 在OOPS中,类需要对象才能执行。 但是需要首先执行main()方法才能调用该类的其他成员。
为了在scala中执行main()方法,许多面向对象的编程语言都使用static关键字,但是scala编程语言中没有static关键字。
这就是为什么在Scala中我们使用定义了main方法的单例对象。
1.3 单例对象的特征 (Features of singleton object)
-
使用object关键字创建。
-
对象中的成员是全局成员,即可以从程序中的任何位置调用成员。
-
单例对象无法创建实例。 即它只能有唯一的实例就是它本身。
-
允许继承,即继承可以扩展类和特征。 (it can extend class and traits.)
-
如果要在一个单例对象中引用 另一个单例对象中的成员,我们将使用 ${引用单例对象的名称}.${成员名称} 的方法引用。
2、object对象的定义方法
2.1 实例
//in scala
object findsum{
var a = 56
var b = 21
def sum(): Int ={
return a+b;
}
}
object Main
{
def print(){
printf("The sum is : "+ findsum.sum());
}
def main(args: Array[String])
{
print();
}
}
解读:这里有2个单例对象findsum和Main 。
Main对象有两个方法main() 和 print() 。
print方法打印由findsum对象中的sum()方法返回的值。
而findsum对象中的sum方法是计算两个数字的和。
3、伴生类和伴生对象
如果一个对象和一个类拥有相同的名称,则它们互称为伴生对象、伴生类。
注意: 伴生类和伴生对象必须定义在一起,即一个脚本中,否则不能成为伴生类和伴生对象。
类和它的伴生对象可以互相访问其私有成员!!!
一般使用伴生对象来定义那些在伴生类中不依赖于实例化对象而存在的成员变量或者方法。
这句话的意思是,因为伴生类和伴生对象可以相互访问私有变量,那么我们就可以利用这个性质来是我们的代码更加的简洁、高可读性。
如果我们把常量或者主逻辑写在伴生对象中,把一些变量、方法或者杂七杂八的东西放在伴生类中,那么我们从伴生对象入口开始读代码,可读性就会很高,主逻辑也更清晰。
实例一:伴生对象中定义main函数
//in scala
//定义一个 伴生类
class Student(sid:Int, sname:String){
val Id = sid
val name = sname
override def toString() =
this.Id+" "+" , "+this.name
}
//定义一个对象和main()方法来调用伴生类和伴生对象中的方法
object Student {
def displaydetails(st: Student){
println("Student Details: " + st.Id+","+st.name);
}
def main(args: Array[String]) = {
var st = new Student(21,"Peter") //实例化 伴生类TestCompanion
println(st)
displaydetails(st) //调用 伴生对象TestCompanion中的方法
}
}
实例二:伴生对象中不定义main函数,另写一个对象来定义
//in scala
//定义一个 伴生类
class TestCompanion(sid:Int, sname:String){
val Id = sid
val name = sname
override def toString() =
this.Id+" "+" , "+this.name
}
//定义一个 伴生对象
object TestCompanion{
def displaydetails(st: TestCompanion){
println("Student Details: " + st.Id+","+st.name);
}
}
//定义一个对象和main()方法来调用伴生类和伴生对象中的方法
object Student {
def main(args: Array[String]) = {
var st = new TestCompanion(21,"Peter") //实例化 伴生类TestCompanion
println(st)
TestCompanion.displaydetails(st) //调用 伴生对象TestCompanion中的方法
}
}