美文网首页Scala
scala-05-类,属性,对象

scala-05-类,属性,对象

作者: chen_666 | 来源:发表于2020-04-05 11:54 被阅读0次

    类的定义

    [修饰符] class 类名 {
    类体
    }

    1)scala语法中,类并不声明为public,所有这些类都具有公有可见性(即默认就是public).
    2)一个Scala源文件可以包含多个类, 每个类默认都是public

    属性

    1)属性的定义语法同变量,示例:[访问修饰符] var 属性名称 [:类型] = 属性值
    2)属性的定义类型可以为任意类型,包含值类型或引用类型[案例演示]
    3)Scala中声明一个属性,必须显示的初始化,然后根据初始化数据的类型自动推断,属性类型可以省略(这点和Java不同)。[案例演示]
    4)如果赋值为null,则一定要加类型,因为不加类型, 那么该属性的类型就是Null类型.
    5)如果在定义属性时,暂时不赋值,也可以使用符号_(下划线),让系统分配默认值, 这时要求属性必须给定数据类型。

    对象的创建

    val | var 对象名 [:类型] = new 类型()
    1)如果我们不希望改变对象的引用(即:内存地址), 应该声明为val 性质的,否则声明为var, scala设计者推荐使用val ,因为一般来说,在程序中,我们只是改变对象属性的值,而不是改变对象的引用。
    2)scala在声明对象变量时,可以根据创建对象的类型自动推断,所以类型声明可以省略,但当类型和后面new 对象类型有继承关系即多态时,就必须写了

      //创建Worker
        val worker = new Worker // worker 类型就是Worker
        val worker2: Emp = new Worker //worker2编译类型就是Emp
        //父类
        class Emp
        //子类
        class Worker extends Emp
    

    样例代码

    object HelloScala {
      def main(args: Array[String]): Unit = {
        //创建一只狗
        val dog = new Dog
        dog.name = "tom"
        dog.age = 10
        dog.weight = 50
        println(dog.say())
      }
     
      class Dog {
        //编写一个Dog类,包含name(String)、age(Int)、weight(Double)属性
        //类中声明一个say方法
        var name:String = ""
        var age :Short = 0
        var weight:Float = 0.0f
        def say(): String = {
          s"小狗的信息如下\t ${name} \t ${age} \t ${weight}"
        }
      }
    }
    

    构造器

    class 类名(形参列表) { // 主构造器
    // 类体
    def this(形参列表) { // 辅助构造器
    }
    def this(形参列表) { //辅助构造器可以有多个...
    }
    }

    1. 辅助构造器 函数的名称this, 可以有多个,编译器通过不同参数(个数或类型)来区分.

    class Person(pName: String, pAge: Int) {
      var name = pName
      var age = pAge
    
      def show(): Unit = {
        println("name=" + this.name + " age=" + this.age)
      }
    }
    
    
     def main(args: Array[String]): Unit = {
        val person = new Person("jack", 18)
        person.show()
      }
    
    注意事项及细节

    1.主构造器的声明直接放置于类名之后
    2.主构造器会执行类定义中的所有语句(把类中写的语句放入到主构造器)

    class Person(pName: String, pAge: Int) {
      var name = pName
      var age = pAge
      age += 10
      println("age=" + age)
      def show(): Unit = {
        println("name=" + this.name + " age=" + this.age)
      }
    
      name += " say ok"
      println("name=" + name)
    }
    

    3.如果主构造器无参数,小括号可省略,构建对象时调用的构造方法的小括号也可以省略

    val dog = new Dog
    

    4.辅助构造器名称为this(这个和Java是不一样的),多个辅助构造器通过不同参数列表进行区分, 在底层就是构造器重载,辅助构造器无论是直接或间接,最终都一定要调用主构造器,执行主构造器的逻辑, 而且调用主构造器语句一定要放在辅助构造器的第一行

    class Person() {
      var name: String = _
      var age: Int = _
      def this(name : String) {
        //辅助构造器无论是直接或间接,最终都一定要调用主构造器,执行主构造器的逻辑
        //而且需要放在辅助构造器的第一行[这点和java一样,java中一个构造器要调用同类的其它构造器,也需要放在第一行]
        this()  //直接调用主构造器
        this.name = name
      }
      def this(name : String, age : Int) {
        this() //直接调用主构造器
        this.name = name
        this.age = age
      }
      def this(age : Int) {
        this("匿名") //简介调用主构造器,因为 def this(name : String) 中调用了主构造器!
        this.age = age
      }
      def showInfo(): Unit = {
        println("person信息如下:")
        println("name=" + this.name)
        println("age=" + this.age)
      }
    }
    

    5.如果想让主构造器变成私有的,可以在()之前加上private,这样用户不能直接通过主构造器来构造对象了

    class C private() {
    
    }
    

    属性

    1.Scala类的主构造器的形参未用任何修饰符修饰,那么这个参数是局部变量
    2.如果参数使用val关键字声明,那么Scala会将参数作为类的私有的只读属性使用
    3.如果参数使用var关键字声明,那么那么Scala会将参数作为类的成员属性使用,并会提供属性对应的xxx()[类似getter]/xxx_$eq()[类似setter]方法,即这时的成员属性是私有的,但是可读写。
    4.将Scala字段加@BeanProperty时,这样会自动生成规范的 setXxx/getXxx 方法。这时可以使用 对象.setXxx() 和 对象.getXxx() 来调用属性,对原来底层自动生成类似xxx(),xxx_$eq()方法,没有冲突,二者可以共存。

    相关文章

      网友评论

        本文标题:scala-05-类,属性,对象

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