Scala实战详解之第8讲 Scala主构造器、私有构造器、构造器重载实战详解

package com.dt.scalaInAction.demo_008


class Teacher { //class Teacher() 也可行  不写"()"则()为类默认的无参的主构造器
  var name : String = _     //通过_ 给属性赋值表示当前没有值 不赋值则编辑报错  这种定义方式编译器会生成共有的getter/setter方法
  private var age = 27      //这种定义方式编译器会生成私有的getter/setter方法
  private[this] var gender = "male"  //这种private[this]定义的方式 这个变量只属于当前的实例
  
  /**
   * 在类的内部定义一个构造器
   * 注意: (1)这个构造器的this这一行不可以省略 它是在调用类的默认的构造器
   *      (2)这个是类的附属构造器 而每个附属构造器必须调用其他的附属构造器, 从最终形态上来看一定会调用类的主构造器
   */
  def this(name : String) {
      this   //不能省略  this() 也可行
      this.name = name
  }
  
  def sayHello = println(this.name+":"+this.age+":"+this.gender)
  
}


/**
 * 定义有参主构造器的类 
 * 注意:在主构造器中声明var 或者 val的变量 都将成为类的成员
 * 
 */
class Teacher_(val name:String, val age:Int) {
    println("This is the primary constructor...")
    var gender : String = _
    println("gender="+gender) //null
    def this(name:String, age:Int, gender:String) {
        this(name, age)
        this.gender = gender
    }
}

/**
 * 定义有参主构造器的类  但不希望调用者使用主构造器
 * 
 */
class Teacher2 private(val name:String, val age:Int) {
    println("This is the primary constructor...")
    var gender : String = _
    println("gender="+gender) //null
    def this(name:String, age:Int, gender:String) {
        this(name, age)
        this.gender = gender
    }
}

/**
 * Scala主构造器
 *      私有构造器
 *      构造器重载实战详解
 */
object OOPInScala {
    def main(args: Array[String]): Unit = {
        var t = new Teacher;
        t.name = "Spark"
        //t.gender  无法访问
        t.sayHello      //Spark:27:male

        
        
        
        var t1 = new Teacher_("Spark", 17)
        println(t1.name+":"+t1.age)
        /*
         *  结果为:
         *  This is the primary constructor...
            gender=null
            Spark:17
         */
        
        
        
        var t2 = new Teacher_("Spark", 17, "male")
        println(t2.name+":"+t2.age+":"+t2.gender)
        /**
         *  结果为:
         *  This is the primary constructor...
            gender=null
            Spark:17:male
         */
        
        
        
        
        //var t3 = new Teacher2("Spark", 17)    //编译报错  由于主构造器 私有化 只能使用非主构造器
        var t4 = new Teacher_("Spark", 17, "male")  //定义正确
        
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值