伴生对象
什么是伴生对象?
- 如果有一个 class 文件,还有一个与 class 同名的 object 文件,那么就称这个 object
是 class 的伴生对象,class 是 object 的伴生类; - 伴生类和伴生对象必须存放在一个.scala 文件中
- 伴生类和伴生对象的最大特点是,可以相互访问;
下面就用代码演示:
//伴生类
class Dog {
val id = 1
private var name = "itcast"
def printName(): Unit ={
//在 Dog 类中可以访问伴生对象 Dog 的私有属性
println(Dog.CONSTANT + name )
}
}
//伴生对象
object Dog {
//伴生对象中的私有属性
private val CONSTANT = "汪汪汪 : "
def main(args: Array[String]) {
val p = new Dog
//访问私有的字段 name
p.name = "123"
p.printName()
}
}
//执行结果 汪汪汪 : 123
知道了伴生对象后,就可以了解下,和类的关系了,接下来就是类相关的
类和伴生对象
首先申明:
- 在 Scala 中,类并不用声明为 public 类型的。
- Scala 源文件中可以包含多个类,所有这些类都具有共有可见性。
class Person {
//用 val 修饰的变量是可读属性,有 getter 但没有 setter(相当与 Java 中用 final 修饰的变量)
val id="9527"
//用 var 修饰的变量都既有 getter,又有 setter
var age:Int=18
//类私有字段,只能在类的内部使用或者伴生对象中访问
private var name : String = "唐伯虎"
//类私有字段,访问权限更加严格的,该字段在当前类中被访问
//在伴生对象里面也不可以访问
private[this] var pet = "小强"
}
//伴生对象(这个名字和类名相同,叫伴生对象)
object Person{
def main(args: Array[String]): Unit = {
val p=new Person
//如果是下面的修改,发现下面有红线,说明 val 类型的不支持重新赋值,但是可以获取到值
//p.id = "123"
println(p.id)
//打印 age
println(p.age)
//打印 name,伴生对象中可以在访问 private 变量
println(p.name)
//由于 pet 字段用 private[this]修饰,伴生对象中访问不到 pet 变量
//p.pet(访问不到)
}
}
类和构造器
- Scala 中的每个类都有主构造器,主构造器的参数直接放置类名后面,与类交织在一起
/**
* 每一个类都有主构造器,主构造器的参数直接放置在类名后面,与类交织在一起
*/
class Student(val name :String,var age:Int){
//主构造器会执行类定义的所有语句
println("执行主构造器")
private var gender="male"
def this(name:String,age:Int,gender:String){
//这里this必须放在这里,放在def的第一行,
//因为每一个辅助构造器执行必须以主构造器或者其他构造器的调用开始
this(name,age)
println("辅助构造器" )
this.gender=gender
}
}
object Student{
def main(args: Array[String]): Unit = {
val s1=new Student("zhangsan",20)
println(s1)
val s2 =new Student("zhangsan",20,"female")
println(s2)
}
}
//执行结果
/*
执行主构造器
Student@7e0babb1
执行主构造器
辅助构造器
Student@6debcae2
*/
scala中的object
- object 相当于 类 的单个实例,通常在里面放一些静态的 field 或者 method;
在 Scala 中没有静态方法和静态字段,但是可以使用 object 这个语法结构来达到同样的
一般说object的作用
- 存放工具方法和常量
- 高效共享单个不可变的实例
- 单例模式
举例说明:单例模式
import scala.collection.mutable.ArrayBuffer
class Session{}
object SessionFactory{
//该部分相当于 java 中的静态块
val session=new Session
//在 object 中的方法相当于 java 中的静态方法
def getSession(): Session ={
session
}
}
object SingletonDemo {
def main(args: Array[String]) {
//单例对象,不需要 new,用【单例对象名称.方法】调用对象中的方法
val session1 = SessionFactory.getSession()
println(session1)
//单例对象,不需要 new,用【单例对象名称.变量】调用对象中成员变量
val session2=SessionFactory.session
println(session2)
}
}