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")
  }
}

打印结果:

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

另外主构造器中参数可以有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只能在主构造器中的代码访问而已。

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")}
}

打印结果:

ArgsNoUse primary constructor :a --3

如果var argsNoUse = new ArgsNoUse("abc",40)

则打印: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")
  }
}

如果

 

转载于:https://my.oschina.net/u/2963604/blog/1806021

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值