1. 程式人生 > >Scala進階

Scala進階

class User{

  //類成員必須初使化,
  var name:String=null

  @BeanProperty var alias:String="caspar"

  private[this] var age=null

  //println將作為主構建器中的一部分,在建立物件時被執行
  println("constructing user ........")

  //重寫toString()方法
  override def toString()= name + ":"+ alias

}

//通過繼承App,定義一個應用程式物件
//擴充套件App後,程式可以直接執行,而不需要自己定義main方法,程式碼更簡潔
object UserTest extends App{
  var user = new User()
  user.name="caspar" //直接修改,但其實呼叫的是p.name_=("jonh")
  user.alias_=("csp") 
  println(user)
}

*Scala會預設生成name(),name_=(.)和建構函式() 
*name()對應java中的getName()方法 
*name_=()對應java中的setName()方法 
*定義的是公有成員,但生成的位元組碼中是以私有方式實現的,生成的getter,setter方法是公有的 
*定義私有成員,其getter,setter也是私有的 
*如果將成員域定義為private[this],則不會生成getter,setter方法 
*private[this]只能由該類建立的物件本身能訪問到,因此它定義的類成員也稱為物件私有成員 
*如需要像java中一樣自動產生getter,setter方法,需要引用scala.reflect.BeanProperty,採用註解的方式修飾變數 
*當主構造器的引數不用var或val修飾的時候,引數會生成類的私有val成員,並且不會產生getter和setter方法 


自定義getter和setter方法 

def name=name  
def name_=(name:String){  
    this.name=name
}


定義類的同時定義主構造器 

class User(val name:String,val age:Int){
  override def toString: String = name +":"+ age
}

object Test extends App{
  val user = new User("caspar",27)
  println(user)
}


主構建器帶預設引數

class User(val name:String="",val age:Int=28){...} 


主構造器中引數帶訪問控制符 

class User(val name:String,private val age:Int=19){
  override def toString: String = name +":"+ age
  println("age"+age)
}

object Test extends App{
  val user = new User("caspar",12)
  //user.age //error inaccessible
  println(user)
}


類名後面緊跟private關鍵字可以將主構建器設為私有,不允許外部使用

class User private(var name:String,var age:Int){...} 


*如果禁用掉了主構建器,則必須使用輔助建構函式來建立物件 
*輔助構建器的名稱為this,java中的輔助建構函式與類名相同,這常常會導致修改類名時出現不少問題,scala語言避免了這樣的問題 
*呼叫輔助建構函式時,必須先呼叫主建構函式或其它已經定義好的建構函式 

只有輔助建構函式的類

class User(){
  //類成員
  private var name:String=null
  private var age:Int=18
  private var sex:Int=0

  //輔助構造器
  def this(name:String){
    this()
    this.name=name
  }
  def this(name:String,age:Int){
    this(name)
    this.age=age
  }
  def this(name:String,age:Int,sex:Int){
    this(name,age)
    this.sex=sex
  }
  override def toString: String = name+":"+age+":"+sex
}

object Test extends App{
  val user1 = new User("caspar",12,1)
  val user2 = new User("caspar",12)
  val user3 = new User("caspar")
  println(user1)
  println(user2)
  println(user3)
}

帶有主構建函式和輔助構建函式的類

class User(var name:String,var age:Int){
  //類成員
  private var sex:Int=0

  def this(name:String,age:Int,sex:Int){
    this(name,age)
    this.sex=sex
  }
  override def toString: String = name +":"+age+":"+sex
}

object Test extends App{
  val user1 = new User("caspar",12,1)
  val user2 = new User("caspar",12)
  println(user1)
  println(user2)
}