classCounter{//字段必須初始化private var value =0//方法默認公有
def increment(): Unit ={
value+=1}
def current()=value
}//使用類構造對象
val myCounter=newCounter
myCounter.increment()
myCounter.increment()println(myCounter.current)
Compiled from "Person2.scala"publicclassPerson2{privateint privateAge;privateintprivateAge();privatevoid privateAge_$eq(int);publicintage();publicvoid age_$eq(int);publicPerson2();}
如果字段是私有的,那麼getter和setter方法也是私有的
如果字段是val,則只有getter方法生成
如果不生成任何getter和setter,可以將字段聲明爲private[this]
只帶getter屬性
將字段聲明爲val,只生成一個final修飾的私有字段和一個公有的getter方法。
例如
//Person3.scalaclassPerson3{
val name="aa"}//查看的字節碼
Compiled from "Person3.scala"publicclassPerson3{privatefinal java.lang.String name;public java.lang.String name();publicPerson3();
var foo:自動合成getter和setter方法
val foo:自動合成一個getter方法
不能實現只有setter沒有getter
自己定義foo和foo_=
對象私有字段
默認情況下,同一個類的一個對象可以訪問另一個對象的私有字段
classCounter{//字段必須初始化private var value :Int =0//方法默認公有
def increment(): Unit ={
value+=1}
def current():Int=value
//可以訪問另一個對象的私有字段value
def isLess(other:Counter):Boolean ={ value < other.value }}
//Person4.scalaclassPerson4{private var age =0private[this] var card =0}//編譯後
Compiled from "Person4.scala"publicclassPerson4{privateint age;privateint card;privateintage();privatevoid age_$eq(int);publicPerson4();}
//Person5.scalaimport scala.beans.BeanProperty
classPerson5{@BeanProperty var age =0}//查看
Compiled from "Person5.scala"publicclassPerson5{privateint age;publicintage();publicvoid age_$eq(int);publicvoidsetAge(int);publicintgetAge();publicPerson5();}
總結一下
序號
scala字段
生成的方法
何時使用
1
val / var name
公有的name,name_=(對於var)
實現一個公開訪問並背後是字段形式保存的屬性
2
@BeanProperty val / var name
公有的name,name_=(對於var),getName,setName(對於var)
與JavaBeans互操作
3
private val / var name
私有的name,name_=(對於var)
字段的訪問限制在本類的方法
4
private[this] val / var name
不生成
字段訪問限制在同一個對象,不經常用到
5
private[類名] val / var name
依賴於具體實現
字段訪問賦予外部類,不經常用到
各種可能的情況查看一下
//Person6.scalaimport scala.beans.BeanProperty
classPerson6{
var name1 =0
val name2 =0private var name3 =0private val name4 =0@BeanProperty var name5 =0@BeanProperty val name6 =0private[this] var name7 =0private[this] val name8 =0}//字節碼
Compiled from "Person6.scala"publicclassPerson6{privateint name1;privatefinalint name2;privateint name3;privatefinalint name4;privateint name5;privatefinalint name6;privateint name7;privatefinalint name8;publicintname1();publicvoid name1_$eq(int);publicintname2();privateintname3();privatevoid name3_$eq(int);privateintname4();publicintname5();publicvoid name5_$eq(int);publicvoidsetName5(int);publicintname6();publicintgetName5();publicintgetName6();publicPerson6();
主構造器的字段需要JavaBeans的getter和setter方法
class Person(@BeanProperty var name:String)
輔助構造器
scala可以有任意多的構造器
最重要的構造器:主構造器
輔助構造器可以有很多
輔助構造器的名稱爲this,(java或C++中構造器的名稱和類名相同,修改類名時不方便)
每一輔助構造器必須以一個對先前定義的其他輔助構造器或主構造器的調用開始
classPerson{private var name =""private var age =0println("主構造器")//第一個輔助構造器
def this(name:String){//調用主構造器this()println("執行第一輔助構造器")this.name=name
}//第二個輔助構造器
def this(name:String,age:Int){//調用第一個輔助構造器this(name)println("執行第二輔助構造器")this.age=age
}}//調用
val p1 =newPerson()println("---")
val p2 =newPerson("及時雨宋江")println("------")
val p3 =newPerson("玉麒麟盧俊義",43)//輸出的結果
主構造器
---
主構造器
執行第一輔助構造器
------
主構造器
執行第一輔助構造器
執行第二輔助構造器
如果想私有主構造器,可以在參數列表前面加入private關鍵字,這樣就只能通過輔助構造器構造對象class Person private(val name:String,val age:Int)
主構造器參數
生成的字段/方法
name:String
如果有方法使用name,則變爲對象私有字段 ,否則不生成字段。從不生成方法
private val / var name:String
私有字段,私有的getter、setter方法(對於var)
val / var name:String
私有字段,公有的getter、setter方法(對於var)
@BeanProperty val / var name:String
私有字段,公有的Scala版和JavaBeans版getter、setter方法
// Person3.scalaimport scala.beans.BeanProperty
classPerson3(val name1:Int,
var name2:Int,
name3:Int,
name4:Int,private var name5:Int,private val name6:Int,@BeanProperty var name7:Int,@BeanProperty val name8:Int){
def descrption ="name3 is "+name3
}//得到的方法和字段//所有的字段全部爲私有,getter或setter有私有也有公有。
Compiled from "Person3.scala"publicclassPerson3{privatefinalint name1;privateint name2;privatefinalint name3;privateint name5;privatefinalint name6;privateint name7;privatefinalint name8;publicintname1();publicintname2();publicvoid name2_$eq(int);privateintname5();privatevoid name5_$eq(int);privateintname6();publicintname7();publicvoid name7_$eq(int);publicvoidsetName7(int);publicintname8();public java.lang.String descrption();publicintgetName7();publicintgetName8();publicPerson3(int,int,int,int,int,int,int,int);
嵌套類
一個外部類的不同對象的內部類是不同的
classNetwork{classMember(val name:String){
val contacts=newArrayBuffer[Member]}private val members=newArrayBuffer[Member]
def join(name:String): Member ={
val m =newMember(name)
members += m
m
}}//
val chatter =newNetwork
val myFace =newNetwork
val fred = chatter.join("Fred")
val wilma = chatter.join("Wilma")
fred.contacts += wilma
val barney=myFace.join("Barney")// fred.contacts += barney //錯誤
如果實現內部類可以相互訪問,使用伴生對象,這樣fred和barney就可以添加好友了。
classNetwork{private val members=newArrayBuffer[Network.Member]
def join(name:String): Network.Member ={
val m =newNetwork.Member(name)
members += m
m
}}
object Network{classMember(val name:String){
val contacts=newArrayBuffer[Member]}}