Scala進階
阿新 • • 發佈:2018-12-25
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) }