美文网首页
scala入门(3)

scala入门(3)

作者: G__yuan | 来源:发表于2019-07-09 17:25 被阅读0次

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()

    }

}

相关文章

网友评论

      本文标题:scala入门(3)

      本文链接:https://www.haomeiwen.com/subject/zhdlzxtx.html