packagecom.learn.scala.day10
importscala.beans.BeanProperty
/**
* Scala的构造函数与Java类似,但是Scala中分主构造函数,和辅助构造函数
* 主构造函数只能有一个,辅助构造函数可以有多个.
* 主构造函数在类名后面,但与Java不同的是位置不一样,还有额外的功能——定义属性
* Created by robbie on 2017/3/1.
*/
/**
* 主构造函数
*/
classPerson {
/**
* //@BeanProperty自动生成get,set方法
* 可以不使用@BeanProperty
*/
@BeanPropertyvarid:String=""
/**
* 姓名,
*/
@BeanPropertyvarname:String=""
/**
* 辅助构造函数,使用this而不像Java直接使用类名
*
*@param id
*@param name
*/
def this(id:String, name:String) {
this()//调用主构造函数
this.id= id;
this.name= name;
}
}
/**
* 主构造函数,有两个参数。
* 构造函数的参数和方法一样可以设置默认值
*@param idT
*@param nameT
*/
classTeacher(idT:String="0000",nameT:String){
/**
*类中可以直接执行代码,在类构造是执行
*/
println("println in Teacher ")
/**
* 属性名不能与参数名相同
*/
@BeanPropertyvarid:String= idT
@BeanPropertyvarname:String= nameT
@BeanPropertyvarage:Int =0
@BeanPropertyvalinnerClass:InnerClass =newInnerClass(idT,"InnerClass_"+name)
def this(id:String,name:String,age:Int){
this(id,name)
this.age= age
//不可以使用内部类的私有属性
// innerClass.id
innerClass.name="hello"
}
/**
* Teacher类的内部类,
*/
classInnerClass(valid:String,varname:String="innerClass"){
/**
* 获取内部类name
*/
defgetClassName():String={
/**
* 如果属性名不一样可以直接使用
* 如果一样可以使用外部类.this,调用外部类的属性,
* 这点与Java一样,
*/
name+"_"+age+"_"+Teacher.this.name
}
}
}
/**
*主构造函数,定义类的属性(必须要有var或val 声明,不然不能成为属性)
*
*@param name
*@param id
*/
classStudent(@BeanPropertyvalid:String,@BeanPropertyvarname:String) {
def this(id:String,name:String,gender:String){
this(id,name)
}
}
objectPerson{
defmain(args: Array[String]): Unit = {
/**
* person 调用辅助构造函数
*/
valperson =newPerson("11-01","Robbie")
println(person.getId+","+person.getName)
/**
* Teacher 调用主构造函数
*/
valteacher =newTeacher("11-02","Tom")
println(teacher.getId+","+teacher.getName+","+teacher.getAge)
/**
* 嵌套类通过teacher调用
*/
println("InnerClass》"+teacher.getInnerClass.getClassName())
valstudent =newStudent("11-03","Robbie")
/**
* student中没有像Java那样定义属性,但是在构造函数中定义了
*/
println(student.getId+" ,"+student.getName)
}
}