上一篇咱们介绍了缩短五倍的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来分享你的开发经验哦