对象
对象:object类型scala类;注意scala中没有static静态关键字,但是可以使用object实现类似操作;
单例对象(singleton)
Scala 中 object对象定义了某个类的单个实例,反编译查看
object对象中有一个静态常量对象,无参构造是私有的,在无参构造中给静态常量对象赋值
package objects
/**
* 单例对象 在整个JVM容器中只存在一个实例
* 成员 ---> 静态
*/
object SingletonObject {
var id: Int = 0
def idFactory: Int = {
id += 1
id
}
def main(args: Array[String]): Unit = {
// 构建单例对象
val s1 = SingletonObject
val s2 = SingletonObject
println(s1)
println(s2)
s1.idFactory
val newId = s2.idFactory
println(newId) // 2
}
}
伴生对象和伴生类
在同一个scala的源文件中,object类名和class类类名一致的,则将object类称为伴生对象,class类称为伴生类;
package objects
/**
* 伴生类:
* 语法:可以获取伴生对象的私有成员
*/
class User {
var uId :Int = User.idFactory
def sayHi:String = {
"Hello World"
}
}
/**
* 伴生对象
* 获取伴生类中的属性需要new 创建对象后调用
*/
object User {
private var id: Int = 0
def idFactory:Int = {
id += 1
id
}
}
apply和unapply
apply
和unapply
方法是object类中的两个方法;
apply
方法是一个工厂方法,主要是用以构建创建伴生类unapply
方法是一个工厂方法,主要是用以解析伴生类内容
package objects
class Person(var name: String, var age: Int)
object Person {
// apply方法 用以构建伴生类
def apply(name: String, age: Int): Person = new Person(name, age)
// unapply方法 用以解析伴生类内容
// Option 有值 [Some]或者无值 [None]
def unapply(p: Person): Option[(String, Int)] = {
if (p == null) None
else {
Some(p.name, p.age)
}
}
def main(args: Array[String]): Unit = {
Array
// 传统写法
val p1 = new Person("zs", 18)
// apply方法
val p2 = Person("ls", 20)
val p3 = Person("ls", 20)
println(p1)
println(p2)
println(p3)
// 将p3作为unapply方法的参数,解析p3的内容,并且赋值给name和age变量
var Person(name, age) = p3
println(name +"\t"+age)
}
}