1.scala的伴生对象和伴生类的定义:当同名的类和单例对象在同一个源码文件中时,这个类称为单例对象的伴生类,对象称为类的伴生对象,这两者是相互的。scala的伴生对象与伴生类主要有两个特点:必须同名,必须在同一个源码文件中。
2.伴生类和伴生对象的两个应用场景:单例模式和在生对象中伴访问伴生类的私有方法。代码如下:
//object定义一个单例对象
object Mytools{
//属性
var pi=3.14
//方法
def getArea(r:Int):Double ={
pi*r*r
}
}
//测试类
object TestObject {
//入口函数
def main(args: Array[String]): Unit = {
//直接访问单例对象
//对象.属性|对象.属性
println(3*Mytools.pi)
println(Mytools.getArea(2))
}
}
//单例模式:让一个类只能产生一个对象
//伴生类
class Logger private(){
def log(message:String): Unit ={
println(message)
}
}
//伴生对象
object Logger{
private val instance=new Logger()
//唯一一个方式可以去访问这个对象
def getInstance():Logger={
instance
}
}
object TestSingle {
def main(args: Array[String]): Unit = {
//var l1=new Logger()//构造函数添加了private,所以在类的外部无法访问
var l1=Logger.getInstance()
var l2=Logger.getInstance()
println(l1==l2)//true,说明这个对象是唯一的
l1.log("test")
}
}
//伴生对象
class Person(var userName:String,private val password:String){
//私有方法
private def validatePassword(input:String): Boolean ={
input == password
}
}
//伴生对象
object Person{
def check(u:Person,pwd:String): Boolean ={
//validatePassword是私有的方法
//但是在伴生对象中,还是可以使用的
u.validatePassword(pwd)
}
}
object TestClassAndObject {
def main(args: Array[String]): Unit = {
var p1=new Person("小明","123456")
println(Person.check(p1,"1234567"))
}
}
//伴生类+伴生对象
//应用场景:在伴生对象中访问伴生类的私有方法