**
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
}