scala构造器

object ConstructorTest {
  def main(args:Array[String]){
    var p = new Person //由于Person没有本身写的主构造器,那么当初始化时,只是执行类中的语句而已
    var p2 = new Person()
    var p3= new Person("zs")
    var p4 = new Person("ls",20)
  }
}
object Person{
  private var i = 1
}
class Person{
  private var name = ""
  private var age =0
 
  println("模拟主构造器中的执行语句"+Person.i)
  Person.i += 1
  def this(name:String){
    this()
    this.name = name
    println(s"name=$name")
  }
  def this(name:String,age:Int){
    this(name)
    this.age = age
    println(s"name=$name,age=$age")
  }
}this

打印结果:对象

模拟主构造器中的执行语句1
模拟主构造器中的执行语句2
模拟主构造器中的执行语句3
name=zs
模拟主构造器中的执行语句4
name=ls
name=ls,age=20get

另外主构造器中参数能够有var/val和不带var/val区别,val则编译器产生getter,var则产生getter和setter ,若是没var/val则产生的字段就会有private[this]限制,即对象私有的。在主构造器的参数列表中还能够直接用private来限制,如private var age,则编译器产生私有age即getter和setter都是私有的。编译器

//class ThisClass(name:String,age:Int){ //name age在类中至少要被一个方法使用,那么name age就会成为不可变字段,而且有private[this]权限即对象私有
//  def pt() = println(s"name=$name age=$age")
//  def comp(other:ThisClass):Boolean = age < other.age //出现错误
//}
class ThisClass(name:String,var age:Int){ //name age在类中至少要被一个方法使用,那么name age就会成为不可变字段,而且有private[this]权限即对象私有
  def pt() = println(s"name=$name age=$age")
  def comp(other:ThisClass):Boolean = age < other.age //主构造中var age则age字段就不会有private[this]权限,因此此处正确
}编译

主构造器中的参数name age若是在类内部没有被访问到,则不会产生相应的字段,name和age只能在主构造器中的代码访问而已。class

object ConstructorTest {
  def main(args:Array[String]){
    var argsNoUse = new ArgsNoUse()
  }
}
class ArgsNoUse(name:String="a",age:Int=3)
{
  println(s"ArgsNoUse primary constructor :$name --$age")
  def hello(){println("hello")}
}object

打印结果:权限

ArgsNoUse primary constructor :a --3方法

若是var argsNoUse = new ArgsNoUse("abc",40)im

则打印:ArgsNoUse primary constructor :abc --40

实验发现,当主构造器为私有以后,只能经过辅助构造器建立对象,代码以下:

var noPrimaryConstructor = new NoPrimaryConstructor("name",30)

println(noPrimaryConstructor.name)

class NoPrimaryConstructor private(var name:String) //此处var必需要有,不然noPrimaryConstructor对象就不会有name属性,由于name成为了private[this]权限,即对象私有
{
  var age = 0
  def this(name:String,age:Int){
    this(name)
    this.name = name
    println("NoPrimaryConstructor this constructor is excute")
  }
}

若是

相关文章
相关标签/搜索