上一篇咱們介紹了縮短五倍的java bean,不知道你在看的時候有沒有一種疑問捏?javascript
本文同步自博主的私人博客wing的地方酒館php
再來回顧一下,兩種代碼的對比java
public class User {
private String name;
private String id;
public User(String name, String id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}複製代碼
data class User(var name: String, var id: String)複製代碼
能夠發現,代碼是少了,可是好像不太同樣,爲何呢? 可能不少人會有這樣的疑問,在java bean中 一般會將成員變量設爲私有,不對外開放,而且提供getter,setter來提供對外訪問,但是kotlin bean確沒有。因而你開始嘗試對data class擴充,而且發現。。若是設置了private 就不能提供getter,setter了。android
若是你有疑問,請繼續看下去。惟一看透真相的是外表看似大人,但大腦萎縮只有兒童智商的名偵探wing!
git
你們都知道。。kotlin是運行在jvm的語言,因此理所固然的,他是遵循jvm虛擬機規範的,也就是說生成的都是class文件,因此咱們能夠反編譯class爲java語言,那他與java作個對比。就能夠明確的獲得咱們想要的答案。github
首先創建一個kt文件,鍵入以下內容:jvm
class User(){
public var name:String = "hah"
}複製代碼
明顯這是一個User類,他具備一個String成員name,這時候在命令行使用kot
linc編譯:this
kotlinc user.kt複製代碼
獲得一個class文件,將class用JD_GUI打開能夠獲得以下代碼:spa
public final class User {
@NotNull
private String name = "hah";
@NotNull
public final String getName() { return this.name; }
public final void setName(@NotNull String <set-?>) { Intrinsics.checkParameterIsNotNull(<set-?>, "<set-?>"); this.name = <set-?>;
}
}複製代碼
諾,真相大白了,事實說明在kotlin中,不須要private而且經過getter與setter,由於由以上結論得出kotlin中的public等價於java中private + getter + setter!!!.net
嗯哼?這下有沒有解決你的疑慮?咱們能夠順便看看伴生對象是如何實現的。
class User(){
public var name:String = "hah"
companion object{
fun getName():String{
return "name"
}
}
}複製代碼
反編譯之後,與user.class同級目錄下會多處一個User$Companion.class的文件,他就是user的伴生對象了,查看對應java代碼以下:
public final class User$Companion {
@NotNull
public final String getName() {
return "name";
}
}複製代碼
看到其實伴生對象並非static實現的,因此說跟static仍是有區別的,既然是object 那麼應該就不是class ,或者說這個class只有一個實例,能夠說另外一種奇葩的單利模式吧。總之這個對象會跟隨user生,跟隨user死,而後她有一個實例,提供了一個方法。目前個人理解是這樣的,若有錯誤,歡迎指出~~
本文這就結束了(嫌文字過短?不要急啦,先去動手實踐下咯。。系列文章,既然挖了坑,就不會拖更的(吧..))
歡迎加入Kotlin小樂園羣(這是一個高質量、優秀的圈子):479109923
若是你是Android開發者,那麼你還能夠來 wing的酒館:425983695來分享你的開發經驗哦