1、为什么要使用Object
通俗解释:在Scala中没有静态方法和静态属性,故使用Object修饰的类名(对象)里面的方法和属性都相当于static修饰的。
专业解释:Scala类中没有java那样的静态成员。Scala采用单例对象来实现与java静态成员同样的功能。单例对象的定义与类定义类似,只是用object关键字替换了class关键字。
package com.scala.test.myclass
object Car {
val price=120000
val color="red"
def run(): Unit ={
println("汽车。。。。")
}
}
package com.scala.test.myclass
object Main {
def main(args: Array[String]): Unit = {
//直接通过类名调用
Car.run();
println(Car.color)
}
}
汽车。。。。
red
2、伴生对象和伴生类
当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象:companion object。你必须在同一个源文件里定义类和它的伴生对象。类被称为是这个单例对象的伴生类:companion class。类和它的伴生对象可以互相访问其私有成员。
package com.scala.test.myclass
class Person(name:String,age:Int) {
private def getInfo(): Unit ={
println("name: "+name+" age:"+age+" weight:"+Person.weight)
}
}
object Person{
private val weight="63kg"
def run(): Unit ={
val person=new Person("LiJun",19)
person.getInfo()
}
}
package com.scala.test.myclass
object Main {
def main(args: Array[String]): Unit = {
//直接通过类名调用
Person.run();
}
}
name: LiJun age:19 weight:63kg
3、apply方法
(1)通常我们会在类的伴生对象中定义apply方法,当遇到类名(参数1....参数n)时,apply方法会被调用;
(2)apply的作用主要是创建类的对象时,不需要通过new这个关键字。
package com.scala.test.myclass
class Person(name:String,age:Int) {
def getInfo(): Unit ={
println("name: "+name+" age:"+age+" weight:"+Person.weight)
}
}
object Person{
private val weight="63kg"
def apply(name: String, age: Int): Person = new Person(name, age)
}
package com.scala.test.myclass
object Main {
def main(args: Array[String]): Unit = {
//调用主构造器
val p1=new Person("LiSi",20)
//调用apply方法
val p2=Person("LiSi",20);
p1.getInfo()
p2.getInfo()
}
}
name: LiSi age:20 weight:63kg
name: LiSi age:20 weight:63kg