4.类、对象、继承、特质
4.1类
4.1.1类的定义
//在scala中,类并不用声明为public,在scala源文件中可以包含多个类,所有这些类都具有公有可见性。
class Person{
//用val修饰的变量是只读属性,有getter但没有setter,相当于java中final修饰的变量
val id = "9527"
//用var修饰的变量既有getter也有setter
var age : Int = 18
//类私有字段,只能在类的内部使用
private var name:String = "唐伯虎"
//对象私有字段,访问权限更加严格,Person类的方法只能访问到当前对象的字段(只能在此类中应用,在它的伴生对象中都用不了。)
private[this] val pet = "小强"
}
4.1.2构造器
注意:主构造器会执行类定义中的所有语言
/**
*每个类都有主构造器,主构造器的参数直接放置类名的后面,与类交织在一起跟在类后面的构造器,叫做主构造器
*/
class Person(val name :String , val age :Int) {
//主构造器会执行类定义中的所有语句
println("主构造器执行了")
try {
println("干起来")
throw new IOException("出错了")
}catch {
case e :NullPointerException=>println("空指针异常")
case e : IOException=>println("IO异常")
}finally{
println("finally执行了")
}
private var gender ="male"
//用this关键字定义辅助构造器
def this(name:String,age:Int,gender:String){
//每个辅助构造器必须以主构造器或其他的辅助构造器的调用开始
this(name,age)
println("执行辅助构造器")
this.gender = gender
}
}
object Person{
def main(args: Array[String]):Unit = {
val p =new Person("zhangsan",18)
println(p)
/*创建 Person之后的执行结果:
主构造器执行了
干起来
IO异常
finally执行了
cn.itcast.test.Person@2ff4f00f*/
}
}
/**
*构造器参数可以不带val或var,如果不带val或var的参数至少被一个方法所使用,那么它将会被提升为字段
*/
//在类名后面加private就变成了私有的
class Queen private (val name:String ,prop:Array[String] ,private var age :Int =18){
println(prop.size)
//prop被下面的方法使用后,prop就变成了不可变得对象私有字段,等同于private[this] val prop ,如果没有被方法使用该参数将不被保存为字段,仅仅是一个可以被主构造器中的代码访问的普通参数
def description = name +"is"+age+"years old with"+prop.toBuffer
}
object Queen{
def main(args:Array[String]){
//私有的构造器,只有在其伴生对象中使用
val q = new Queen("hatano",Array("蜡烛","手铐"),20)
println(q. description ())
}
}
4.2对象
4.2.1 单例对象
在Scala中没有静态方法和静态字段,但是可以使用object这个语法结构来达到同样的目的
1.存放工具方法和常量
2.高效共享单个不可变的实例
3.单例模式
object SingletonDemo{
def main (args:Array[String]){
//单例模式,不需要new ,用【类名,方法】调用对象中的方法
val session = SessionFactory.getSession()
println(session)
}
}
object SessionFactory {
//该部门相当于java中的 静态块
var counts = 5
val sessions = new ArrayBuffer[Session]()
while( counts > 0 ){
sessions += new Session
counts -= 1
}
def getSession():Session = {
sessions.remove(0)
}
}
class Session{
}
4.2.2 伴生对象
在scala的类中,与类名相同的对象叫做伴生对象,类和伴生对象之间可以相互访问私有的方法和属性。
class Dog {
val id = 1
private var name = "itcast"
def printName():Unit = {
//在Dog类中可以访问伴生对象Dogde 私有属性
println(Dog.CONSTANT + name)
}
}
/*
*伴生对象
*/
object Dog{
//伴生对象中的私有属性
private val CONSTANT = "旺旺旺"
def main(args : Array[String]){
val p = new Dog
//访问私有字段name
p.name = "123"
p. printName()
}
}
网友评论