scala构造器及属性高级

**

scala构造器

**
和java一样,scala构造对象也需要调用构造方法,并且可以有任意多个构造方法(即scala中的构造器)

基本语法:
class 类名[形参列表]{ //主构造器
//类体
}
def this[形参列表]{ //辅助构造器
}
def this[形参列表]{ //辅助构造器可以有多个
}
//  辅助构造器函数的名称this,可以有多个,编译器通过不同参数来区分

scala构造器注意事项和使用细节

1 scala构造器作用是完成对新对象的初始化,构造器没有返回值

2 主构造器的声明直接放置于类名之后[反编译]

3 主构造器会执行类定义中的所有语句,这里可以体会到scala的函数式编程和面向对象编程融合在 一起,即:构造器也是方法(函数),传递参数和使用方法和前面的函数部分内容没有区别

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

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

6 辅助构造器的声明不能和主构造器的声明一致,会发生错误

7 辅助构造器名称为this(这个和java是不一样的),多个辅助构造器通过不同参数列表进行区分,在底层就是构造器重载。

示例1:

object ConDemo01 {
  def main(args: Array[String]): Unit = {
    val p1 = new Person("jack", 20)
    println(p1)
  }
}
//创建Person对象的同时初始化对象的age属性值和name属性值
class Person(inName:String,inAge:Int){
  var name: String = inName
  var age: Int = inAge
  age += 10
  println("********")

  //重写了toString,便于输出对象的信息
  override def toString: String = {
    "name=" + this.name + "\t age=" + this.age

  }
  println("ok")
  println("age=" + age)

  def this(name: String){
//辅助构造器,必须在第一行显式调用主构造器
//辅助构造器无论是直接或间接,最终都一定要调用主构//造器,执行主构造器的逻辑,而且需要放在辅助构造器//的第一行[这点和java一样,Java中一个构造器要调用//同类的其它构造器,也需要放在第一行]

    this("jack",10)
    this.name = name
  }
}

示例2:

object ConDemo02 {
  def main(args: Array[String]): Unit = {
    val a = new A
    //输出的顺序是
    // 1 b
    // 2 A() 主构造器
    // 3 A this(name:String) 辅助构造器
  }
}
class B{
  println("b")
}
class A extends B {
  println("A()")
  def this(name: String){
    this  //调用A的主构造器
    println("A this(name:String)")
  }
}

示例3:

object ConDemo04 {
  def main(args: Array[String]): Unit = {
    val worker2 =new Worker2("smith2")
    worker2.inName  //可以访问 inName
    println("hello!")

    val worker3 = new Worker3("jack")
    worker3.inName = "mary"


  }
}

// 1 如果 主构造器是Worker(inName: String) ,那么 inName 就是一个局部变量
class  Worker(inName: String){
  var name = inName
}
// 2 如果主构造器是worker2(val inName: String),那么 inName就是Worker2的
//一个private的只读属性
class  Worker2 (val inName: String){
  var name = inName
}
// 3 如果主构造器是worker3(val inName: String),那么 inName就是Worker3的
//一个private的可以读写属性
class  Worker3 (var inName: String){
  var name = inName
}

**

属性高级

**
Bean属性
JavaBeans规范定义了Java的属性是像getxxx()和setxxx()的方法。许多Java工具(框架)都依赖这个命名习惯,为了Java的互操作性,将Scala字段加@BeanProperty时,这样会自动生成规范的setxxx/ getxxx方法,这时可以使用对象.setxxx()和对象.getxxx()来调用属性。
注意:给某个属性加入@BeanProperty注解后,会生成getxxx和setxxx的方法,
并且对原来底层自动生成类似xxx(),xxx_$eq()方法,没有冲突,二者可以共存
示例:

import scala.beans.BeanProperty
object BeanPropertDemo {
  def main(args: Array[String]): Unit = {
    val car = new Car
    car.name = "宝马"
    println(car.name)

    //使用@BeanPropert 自动生成 getxxx 和 setxxx
    car.setName("奔驰")
    println(car.getName())
  }
}
class Car{
  @BeanProperty var name: String = null
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值