// Scala的getter和setter方法的命名与java是不同的,是field和field_=的方式// 如果要让scala自动生成java风格的getter和setter方法,只要给field添加@BeanProperty注解即可// 此时会生成4个方法,name: String、name_=(newValue: String): Unit、getName(): String、setName(newValue: String): Unitimport scala.reflect.BeanProperty
classStudent {@BeanPropertyvar name: String = _
}
classStudent(@BeanProperty var name: String)val s = new Student
s.setName("leo")
s.getName()
七、 辅助constructor
// Scala中,可以给类定义多个辅助constructor,类似于java中的构造函数重载// 辅助constructor之间可以互相调用,而且必须第一行调用主constructorclassStudent {privatevar name = ""privatevar age = 0defthis(name: String) {
this()
this.name = name
}
defthis(name: String, age: Int) {
this(name)
this.age = age
}
}
八、主constructor
// Scala中,主constructor是与类名放在一起的,与java不同// 而且类中,没有定义在任何方法或者是代码块之中的代码,就是主constructor的代码,这点感觉没有java那么清晰class Student(val name: String, val age: Int) {
println("your name is " + name + ", your age is " + age)
}
// 主constructor中还可以通过使用默认参数,来给参数默认的值class Student(val name: String = "leo", val age: Int = 30) {
println("your name is " + name + ", your age is " + age)
}
// 如果主constrcutor传入的参数什么修饰都没有,比如name: String,那么如果类内部的方法使用到了,则会声明为private[this] name;否则没有该field,就只能被constructor代码使用而已
九、 内部类
// Scala中,同样可以在类中定义内部类;但是与java不同的是,每个外部类的对象的内部类,都是不同的类import scala.collection.mutable.ArrayBuffer
classClass {classStudent(val name: String) {}
val students = new ArrayBuffer[Student]
def getStudent(name: String) = {
new Student(name)
}
}
val c1 = new Class
val s1 = c1.getStudent("leo")
c1.students += s1
val c2 = new Class
val s2 = c2.getStudent("leo")
c1.students += s2
// 如果我们创建了子类的对象,但是又将其赋予了父类类型的变量。则在后续的程序中,我们又需要将父类类型的变量转换为子类类型的变量,应该如何做?// 首先,需要使用isInstanceOf判断对象是否是指定类的对象,如果是的话,则可以使用asInstanceOf将对象转换为指定类型// 注意,如果对象是null,则isInstanceOf一定返回false,asInstanceOf一定返回null// 注意,如果没有用isInstanceOf先判断对象是否为指定类的实例,就直接用asInstanceOf转换,则可能会抛出异常classPersonclassStudentextendsPersonval p: Person = new Student
var s: Student = nullif (p.isInstanceOf[Student]) s = p.asInstanceOf[Student]
getClass和classOf
// isInstanceOf只能判断出对象是否是指定类以及其子类的对象,而不能精确判断出,对象就是指定类的对象// 如果要求精确地判断对象就是指定类的对象,那么就只能使用getClass和classOf了// 对象.getClass可以精确获取对象的类,classOf[类]可以精确获取类,然后使用==操作符即可判断classPersonclassStudentextendsPersonval p: Person = new Student
p.isInstanceOf[Person]
p.getClass == classOf[Person]
p.getClass == classOf[Student]
使用模式匹配进行类型判断
// 但是在实际开发中,比如spark的源码中,大量的地方都是使用了模式匹配的方式来进行类型的判断,这种方式更加地简洁明了,而且代码得可维护性和可扩展性也非常的高// 使用模式匹配,功能性上来说,与isInstanceOf一样,也是判断主要是该类以及该类的子类的对象即可,不是精准判断的classPersonclassStudentextendsPersonval p: Person = new Student
p match {
case per: Person => println("it's Person's object")
case _ => println("unknown type")
}