7.1 类的定义
在Scala中,类并不声明为public。Scala源文件中可以包含多个类,所有这些类都具有public可见性。使用Scala类需要做的就是构造对象,并按照通常的方式来调用方法。
class Student {
var name = “”;// 初始化为空字符串
var age = 0; // 初始化0
def doSomething() {
age += 1
}
}
class Teacher {
var name = “”;
var level = “”; //级别
}
初始化类:var stu = new Student,当然也可以写成var stu = new Student(),有没有括号,都是看个人习惯,两条语句所起到的作用是一样的,都是new了一个Student对象。同理,在调用无参的方法时,也可以使用()号,也可以不用。stu.doSomething与stu.doSomething()都是一个意思。不过在Scala编程习惯中,改变对象状态的方法调用时后面就加上()符号,如果只是取值的话,就不用加()符号,这样显得更简洁。
7.2 getter和setter 方法
在Java中,为了类属性的安全,一般都是将类的属性声明为private,然后在提供public的getter、setter方法。Scala中也是有getter和setter方法的,只是语法形式与Java的不一样而已。例如:
object StudentTest {
def main(args : Array[String]) : Unit = {
var stu = new Student
stu.name = "张三"
stu.score = 100
println(stu.name + ":" + stu.score)
}
class Student {
var name = ""
var score = 0
}
}
Student类两个属性name和score,默认情况下,name和score属性不是公有的,但是在创建了一个Student实例后,stu.name = ”张三” 实际上是调用了Student类的 _name 方法,这个就是Student类的setter方法,而getter方法实际上就是 name 方法,所以println(stu.name)就可以打印出名字,按照Java的思想来理解,可能会认为name属性默认声明了为public,但实际上不是的。
如果你不想提供setter方法怎么办?在Scala中,如果不想提供setter方法,那么声明属性的时候,用val来代替var即可,试试将Student类的name属性的声明改成val,那么在代码stu.name = “张三” 那行,编译器就会报错:
当然,你也可以将name用private来修饰,这样的情况,默认的getter和setter方法也是private的,这样name属性的getter和setter方法都会报错:
那怎么给name属性赋值和取值?可以重写getter和setter方法:
object StudentTest {
def main(args : Array[String]) : Unit = {
var stu = new Student
stu.name = "张三"
stu.score = 100
println(stu.name + ":" + stu.score)
}
class Student {
private var privateName = ""
var score = 0
// setter方法
def name = privateName
// getter方法
def name_= (newName:String){
privateName = newName
}
}
}
7.3 Bean属性
Scala的getter和setter方法,是与在Java不同的,如果想按照Java那样定义getter和setter方法,可以将该属性标注为@BeanProperty,这样就会自动生成getXXX和setXXX方法,例如:
import scala.beans.BeanProperty
object StudentTest {
def main(args : Array[String]) : Unit = {
var stu = new Student
stu.name = "张三"
stu.score = 100
println(stu.name + ":" + stu.score)
// 类似java的getter和setter方法
stu.setAddress("白云区")
println(stu.name + ":" + stu.score + " 地址:" + stu.getAddress())
}
class Student {
private var privateName = ""
var score = 0
@BeanProperty
var address = ""
// setter方法
def name = privateName
// getter方法
def name_= (newName:String){
privateName = newName
}
}
}