用 object 关键字来创建一个单例对象。单例对象在整个应用程序中只有一个实例,适合用于存放工具方法、常量或共享状态。
格式: object 对象名{
属性
方法
}
[ 代码说明 ] :
1. 通过object关键字创建的是一个对象,不是一个类型。
2. 不能使用new关键字:声明单例对象的时候不可以使用new关键字。
不能传递参数:单例对象无法传递参数 单列对象: 只有一个,不能被new; 适用于存放工具方法,常量。
单列对象:
练习:
object class2 {
object MyTool {
// 属性
val PI=3.14
//方法
def Area(r:Double):Double={
PI*r*r
}
}
def main(args: Array[String]): Unit = {
// 对象名
// 对象.方法名()
println( MyTool.PI)
println(MyTool.Area(10))
}
}
结果:
伴生对象
当同名的类和单例对象在同一个源码文件时,这个类称为单例对象的伴生类,对象称为类的伴生对象
object Person {
}
class Person{
}
代码说明:
1. 类名和对象名必须同名。
必须在同一个源码文件中
练习:访问私有方法:
代码:
object class3 {
/***
*
* 伴生类 和伴生对象
*
*/
class Student() {
// private 修饰的属性,无法在类的内部被访问!
private val hobby="打游戏"
}
object Student {
def introduce(stu:Student):Unit={
println(s"我的爱好是:${stu.hobby}")
}
}
def main(args: Array[String]): Unit = {
val stu1=new Student()
// stu.hobby // 无法访问私有属性
Student.introduce(stu1)
}
}
结果:
练习2
package levelo2
object class8 {
class Logger(var filename:String){
def log(message:String):Unit={
println(s"Log:$message")
}
}
object Logger {
private var instance:Option[Logger]=None
def apply(filename:String):Logger={
if(instance.isEmpty){
instance=Some(new Logger(filename))
}
instance.get
}
}
def main(args: Array[String]): Unit = {
val log1=Logger("test.log")
log1.log("205-11-03 上午有课")
}
}
结果: