scala学习之类和对象

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

用放荡不羁的心态过随遇而安的生活
原文地址:https://www.cnblogs.com/re-myself/p/5532485.html