scala中的类和java中有些不同,嗯更加简洁一些,习惯了java bean的写法,对于scala还是不太适应的,虽然说一堆 getter、setter方法确实很臃肿,但是使用IDE生成似乎也不费劲...
class Person {
private var age = 0 //声明私有变量
var birthday = new Date()
var name = ""
private [this] var secret = "" //访问限制,只有类方法可以访问
//对象私有属性,不会生成setter和getter方法
def increment(){ age += 1}
def current() = age
def keepSecret(): Unit ={
secret = "this is my secret";secret
}
//和java一样,如果每一天显式定义主构造方法,会自动用于一个无参构造方法
def this(name: String){ //辅助构造方法
this() //调用主构造方法
this.name = name
}
def this(age:Int , name: String){
this(name) //调用辅助构造方法
this.age = age
}
}
对于构造方法,scala有自己的一套,直接写在类定义中,嗯,看上去不错,但是我不习惯
/**
* 主构造方法 定义在类上
* @param name
*/
class People (val name : String){
var age = 0
def description = name + "is" + age +"years old"
}
对象: 在scala中没有静态方法或者字段,但是可以使用object来达到同样的目的,可以像java中静态方法一样使用:类.方法,除此之外,scala中又多出来伴生对象,也是利用object关键字来做的,且看代码
/**
* 伴生对象
*/
class Account {
val id = Account.newUniqueNumber
private var balance = 0.0
def deposit(amount:Double){balance += balance}
}
object Account{
private var lastNumber = 0;
private def newUniqueNumber = {lastNumber+=1;lastNumber}
}
类和它的伴生对象可以相互访问私有对象,但是必须存在于同一个源文件中。
枚举
scala中没有枚举,但是可以通过继承 Enumeration来实现
object TrafficLight extends Enumeration{
val RED = Value(0,"Stop")
val YELLOW = Value(1,"wait")
val GREEN = Value(2,"Go")
}
使用如下
TrafficLight.GREEN
TrafficLight(0)
TrafficLight.withName("Stop")
注意:枚举的类型是TrafficLight.Value,而不是TrafficLight