快學(xué)scala之類

1. 幾點(diǎn)說明

先來個例子

class Person {
  var age = 0 // 必須初始化
  private var privateName = "zmz" // private修改,getter和setter都為private
  val sex = "M" // val修飾淑倾,只有g(shù)etter,沒有setter

  def name = privateName
  def name_=(newName: String): Unit={ // 自定義setter
    name = newName;
  }

  def increment(): Unit ={ // 方法默認(rèn)為public
    age += 1
  }

  def current = age

  def current2() = age
}

使用javap命令進(jìn)行反編譯撑帖,查看上述Person類的字節(jié)碼:

public class class_chapter.Person {
  private int age;
  private java.lang.String privateName;
  private final java.lang.String sex;
  public int age();
  public void age_$eq(int);
  private java.lang.String privateName();
  private void privateName_$eq(java.lang.String);
  public java.lang.String sex();
  public java.lang.String name();
  public void name_$eq(java.lang.String);
  public void increment();
  public int current();
  public int current2();
  public class_chapter.Person();
}

定義類時的幾點(diǎn)說明:

  1. 字段必須初始化筐眷,默認(rèn)為私有的
  2. 對于字段xxx,scala默認(rèn)添加gettersetter方法垒手,名稱分別為:xxx()xxx_$eq(SomeType)蒜焊,這時字段稱為屬性,默認(rèn)為public; 如果字段定義時加上private科贬,則gettersetter方法為private
  3. val 類型的字段只有getter
  4. 在代碼中定義setter時泳梆,方法名為:xxx_=(SomeType)
  5. 對于無參方法,如果定義時帶上了圓括號()榜掌,則調(diào)用時可帶可不帶优妙;但是,如果定義時沒有帶圓括號()憎账,則調(diào)用時也不能帶
  6. 對于無參方法,建議:如果方法改變字段的取值套硼,帶上(),否則不帶

2. 私有字段

在scala中胞皱,方法可以訪問該類的所有對象的私有字段邪意,例如下面的sayHello方法,

class Person {
  var age = 0 // 必須初始化
  private var privateName = "zmz"
  val sex = "M"

  def name = privateName
  def name_=(newName: String): Unit={
    name = newName;
  }

  def increment(): Unit ={ // 方法默認(rèn)為public
    age += 1
  }

  def current = age

  def current2() = age

  def sayHello(other: Person): String = {
    "Hello " + other.privateName
  }
}

雖然privateName是private的朴恳,但是仍然可以訪問other的privateName抄罕。

那有沒有限定只能在本對象中訪問的方法呢?當(dāng)然有于颖。

private[this] var privateName = "zmz"

如果想上面這種定義方法呆贿,則不能跨對象訪問私有變量。

3. 構(gòu)造器

3.1 輔助構(gòu)造器

關(guān)于輔助構(gòu)造有兩點(diǎn)說明:

  1. 輔助構(gòu)造器的名稱為this
  2. 輔助構(gòu)造器必須首先調(diào)用主構(gòu)造器或者另一個已經(jīng)定義的輔助構(gòu)造器
class Person {
  var age = 0 // 必須初始化
  private var privateName = "zmz"
  val sex = "M"

  def this(age: Int){
    this()  // 主構(gòu)造器
    this.age = age
    this.privateName = "zmz"
  }

  def this(name: String){
    this(20)  // 調(diào)用上一個輔助構(gòu)造器
    this.privateName = name
  }

}

object Main extends App{
  val p1 = new Person   //主構(gòu)造器 
  val p2 = new Person(3) // 第一個輔助構(gòu)造器
  val p3 = new Person("zmz")  // 第二個輔助構(gòu)造器
}

3.2 主構(gòu)造器

class Person (var name: String, private val age: Int){
  println("Person is defining...")  // 屬于主構(gòu)造器

  def this(name: String){
    this(name, 20)
  }
}

object Main extends App{
  val p1 = new Person("zmz", 28) // 主構(gòu)造函數(shù)
}

執(zhí)行上述代碼的輸出為:

Person is defining...

使用javapPerson類進(jìn)行反編譯:

public class class_chapter.Person {
  private java.lang.String name;
  private final int age;
  public java.lang.String name();
  public void name_$eq(java.lang.String);
  private int age();
  public class_chapter.Person(java.lang.String, int);
  public class_chapter.Person(java.lang.String);
}

主構(gòu)造器的定義與類定義交織在一起森渐,關(guān)于主構(gòu)造器做入,有幾點(diǎn)說明:

  1. 主構(gòu)造器的參數(shù)直接放在類名后
  2. 主構(gòu)造器會執(zhí)行類中定義的所有語句,例如例子中的println方法
  3. 在主構(gòu)造器的參數(shù)中同衣,val 竟块、 varprivate 的作用方式與在類中定義的字段時相同

另外耐齐,我們也可以將主構(gòu)造器聲明為private浪秘,這時蒋情,必須使用輔助構(gòu)造器來定義對象了,例如:

class Person private(val id: Int){...}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耸携,一起剝皮案震驚了整個濱河市棵癣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夺衍,老刑警劉巖狈谊,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沟沙,居然都是意外死亡河劝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門矛紫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赎瞎,“玉大人,你說我怎么就攤上這事颊咬〖褰浚” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵贪染,是天一觀的道長。 經(jīng)常有香客問我催享,道長杭隙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任因妙,我火速辦了婚禮痰憎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘攀涵。我一直安慰自己铣耘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布以故。 她就那樣靜靜地躺著蜗细,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怒详。 梳的紋絲不亂的頭發(fā)上炉媒,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音昆烁,去河邊找鬼吊骤。 笑死,一個胖子當(dāng)著我的面吹牛静尼,可吹牛的內(nèi)容都是我干的白粉。 我是一名探鬼主播传泊,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸭巴!你這毒婦竟也來了眷细?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤奕扣,失蹤者是張志新(化名)和其女友劉穎薪鹦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惯豆,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡池磁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了楷兽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片地熄。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖芯杀,靈堂內(nèi)的尸體忽然破棺而出端考,到底是詐尸還是另有隱情,我是刑警寧澤揭厚,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布却特,位于F島的核電站,受9級特大地震影響筛圆,放射性物質(zhì)發(fā)生泄漏裂明。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一太援、第九天 我趴在偏房一處隱蔽的房頂上張望闽晦。 院中可真熱鬧,春花似錦提岔、人聲如沸仙蛉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荠瘪。三九已至,卻和暖如春赛惩,著一層夾襖步出監(jiān)牢的瞬間巧还,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工坊秸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麸祷,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓褒搔,卻偏偏與公主長得像阶牍,于是被迫代替她去往敵國和親喷面。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法走孽,類相關(guān)的語法惧辈,內(nèi)部類的語法,繼承相關(guān)的語法磕瓷,異常的語法盒齿,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • 前言 人生苦多,快來 Kotlin 困食,快速學(xué)習(xí)Kotlin边翁! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,201評論 9 118
  • 麻痹硕盹,每天累的樣符匾。想當(dāng)初選擇這就是因?yàn)橐詾檫@里稍微休閑一點(diǎn)才不論工資如何才留下來了,特現(xiàn)在累的手切個菜都拿不動了瘩例,...
    b1ueb1ue閱讀 141評論 0 0
  • 四月雨茫茫啊胶, 難得出驕陽; 百花齊爭艷垛贤, 清風(fēng)似更香焰坪。
    他說這不是詩閱讀 212評論 0 0
  • 最近實(shí)在懶惰的無可救藥,在逛知乎的時候看到晨間日記很受推崇聘惦,決定嘗試一下琳彩。拜讀了佐藤先生的大作《晨間日記的奇跡》,...
    阡陌有徑閱讀 507評論 0 2