7.4 类构造器与内部类
7.4.1 类构造器
和Java一样,Scala也支持多个构造器的定义,不过最重要的是主构造器,每个类都必须要有主构造器,主构造器不以this方法定义,而是与类定义交织在一起。
Java构造器示例:
public class Teacher {
private String name;
private int age;
public Teader(String name, int age) {
this.name = name;
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
public String getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setName() {
return name;
}
}
Scala构造器示例:
import scala.beans.BeanProperty
object TeacherTest {
def main(args : Array[String]) : Unit = {
var t = new Teacher("李老师", 25)
println("老师姓名:" + t.name + " 年龄:" + t.age)
println("老师姓名:" + t.getName() + " 年龄:" + t.getAge())
}
class Teacher(@BeanProperty var name: String, @BeanProperty var age: Int) {
println(“执行构造器里面的代码!”)
}
}
从示例中可以看到,Scala的代码是相对Java来说极其精简,在Scala中的主构造器中,参数可以直接放在类名之后,并被编译成字段,其值则在构造时初始化为传入的参数,如果构造器中没有参数,例如 class Teacher { //… 省略字段的定义 },那么该类则拥有一个无参的主构造器,相当于Java里面的无参构造函数。
在主构造器中的参数,也可以加入修饰符private或者private[this],表示该参数只允许在类里面调用,就更之前学习的属性定义是一个意思。
主构造器参数 | 生成的字段/方法 |
name:String | 对象私有字段。如果没有方法使用name,则没有该字段 |
private val/var name:String | 私有字段,私有的get/set方法 |
varl/var name:String | 私有字段,公有的get/set方法 |
@BeanProperty val/var name:String | 私有字段,公有的Scala版和JavaBeans版的get/set方法 |
从Java开发转到Scala开发,对主构造器的语法可能有些难以理解,但在实际运用中,也可以不定义主构造器,但是得提供一个或多个辅助构造器,什么是辅助构造器?在Scala中,辅助构造器的名称为this,每一个辅助构造器都必须以一个对先前已定义的其他辅助构造器或主构造器的调用开始,还是拿刚才的Teacher类为例:
class Teacher {
private var name = ""
private var age = 0
def this(name:String) { // 辅助构造器1
this() // 如果在这里不调用主构造器,则编译会出错
this.name = name
}
def this(name:String, age:Int) { // 辅助构造器2
// 可以用this()或者this(name),前提是必须调用一个已定义好的主构造器或者辅助构造器
this(name)
this.age = age;
}
}
辅助构造器,其实就是相当于Java中构造器的重载,只不过不同的是,在Java中,构造器的名称和Java类的类名一致,而Scala中,辅助构造器的名称用this来代替。比较方便的是,Scala中如果类名写错了,那么直接改类名就成,而在Java中,则需要对修改每一个构造器的名称。
7.4.2 内部类
在Scala中,可以在任何语法结构中内嵌任何语法结构,即在函数中也可以定义一个新的函数,在类中也可以定义类,相当于Java里面的内部类,如代码示例:
object PersonObject {
def main(args: Array[String]): Unit = {
val p = new Person
var man = new p.Man
var woman = new p.Woman
man.manWork()
woman.womanWork()
}
class Person {
class Man {
def manWork() {
println("The man is very strong!")
}
}
class Woman {
def womanWork() {
println("The woman is very beatiful!")
}
}
}
}