Scala中的object:
Scala是没有java中的静态成员的 。如果需要用到static变量、static 方法,就要用到Scala的单例对象object 。
注意:
使用object定义一个单例对象,可以用object作为工具类或存放常量
//单例对象只能有一个无参的主构造器,不能添加其他参数
object DateUtils {
//在object中定义的成员变量,相当于java中定义的一个静态变量
val simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm")
//object单例对象的构造代码可以直接卸载花括号中
println("构造代码")
//相当于java中定义的静态方法
def format(date:Date) = simpleDateFormat.format(date)
def main(args: Array[String]): Unit = {
println(DateUtils.format(new Date()))
}
}
Scala中的伴生对象
- 在同一个Scala文件中,有一个class和object具有同样的名字,那么就称这个object是class的伴生对象,class是object的伴生类 ;
- 伴生类和伴生对象的最大特点:可以相互访问
注意:
- 伴生类和伴生对象可以互相访问private的属性
package com
class ClassObject {
val id = 1
private var name = "itcast"
def printName(): Unit ={
//在Dog类中可以访问伴生对象Dog的私有属性
println(ClassObject.CONSTANT + name )
}
}
object ClassObject{
//伴生对象中的私有属性
private val CONSTANT = "汪汪汪 : "
def main(args: Array[String]) {
val p = new ClassObject
//访问私有的字段name
p.name = "123"
p.printName()
}
}
Scala中object的apply方法:
val a = Array(1,2,3,4) 这种写法非常简便,不需要再写一个new,然后敲一个空格,再写类名。如何直接使用类名来创建对象呢?
- 实现伴生对象的apply方法 , 即object Person {def apply()xxx}
- 伴生对象的apply方法用来快速创建一个伴生类的对象
说明:
- 当遇到类名(参数1, 参数2...)会自动调用apply方法,在apply方法中来创建对象
- 定义apply时,如果参数列表是空,也不能省略括号(),否则引用的是伴生对象
class Person(var name:String,var age:Int) {
override def toString: String = s"Person($name,$age)"
}
object Person {
// 实现apply方法
// 返回的是伴生类的对象
def apply(name:String, age:Int): Person = new Person(name, age)
// apply方法支持重载
def apply(name:String):Person = new Person(name, 20)
def apply(age:Int):Person = new Person("某某某", age)
def apply():Person = new Person("某某某", 20)
}
object Main2 {
def main(args: Array[String]): Unit = {
val p1 = Person("张三", 20)
val p2 = Person("李四")
val p3 = Person(100)
val p4 = Person()
println(p1)
println(p2)
println(p3)
println(p4)
}
}
Scala中object的main方法:
- scala和Java一样,如果要运行一个程序,必须有一个main方法
- 而在Java中main方法是静态的,而在scala中没有静态方法 ,所以在scala中,这个main方法必须放在一个object中
- 也可以继承自App Trait ,然后将需要编写在main方法中的代码,写在object的构造方法体内。其本质是调用了Trait这个特质中的main方法
object Main2 extends App { println("hello, scala") }