关于Kotlin data类

由于kotlin和java一样都是运行在jvm虚拟机上,所以最终生成的都是遵循jvm规范的字节码,因此可以通过反编译kotlin生成的字节码为java代码来学习kotlin的原理。

1.data类的写法

```

data class People(var name:String,var age:Int)

```

2.反编译成java代码后自动生成了变量的get、set方法,equals方法,copy方法,component1(),component2(),hashCode()方法,如下:

```

public final class People {

@NotNull

private String name;

private int age;

@NotNull

public final String getName() {

return this.name;

}

public final void setName(@NotNull String var1) {

Intrinsics.checkParameterIsNotNull(var1,"");

this.name = var1;

}

public final int getAge() {

return this.age;

}

public final void setAge(intvar1) {

this.age = var1;

}

public People(@NotNull String name, int age) {

Intrinsics.checkParameterIsNotNull(name,"name");

super();

this.name = name;

this.age = age;

}

@NotNull

public final String component1() {

return this.name;

}

public final int component2() {

return this.age;

}

@NotNull

public final People copy(@NotNull String name, int age) {

Intrinsics.checkParameterIsNotNull(name,"name");

return new People(name,age);

}

// $FF: synthetic method

// $FF: bridge method

@NotNull

public static People copy$default(People var0,String var1, int var2, int var3,Object var4) {

if((var3 &1) !=0) {

var1 = var0.name;

}

if((var3 &2) !=0) {

var2 = var0.age;

}

return var0.copy(var1,var2);

}

public String toString() {

return "People(name="+this.name +", age="+this.age +")";

}

public int hashCode() {

return (this.name !=null?this.name.hashCode():0) *31+this.age;

}

public boolean equals(Object var1) {

if(this!= var1) {

if(var1 instanceof People) {

People var2 = (People)var1;

if(Intrinsics.areEqual(this.name,var2.name) &&this.age == var2.age) {

return true;

}

}

return false;

}else{

return true;

}

}

}

```

3.如果变量是val修饰,如data class People(var name:String,val age:Int),则只会为age变量生成get方法。

4.如果data类中需要定义常量,则常量的实际初始化阶段是在构造方法中,这点与java是不一样的

kotlin代码:

```

data class People(var name: String, var age: Int) {

val female=1

val male=2

}

```

反编译后的java代码(部分片段):

```

private final int female;

private final int male;

@NotNull

private String name;

private int age;

public People(@NotNull String name, int age) {

super();

this.name = name;

this.age = age;

this.female =1;

this.male =2;

}

```

这点要尤其注意,因为在json的反序列化的过程中,如果调用的是无参构造方法(gson的实现),那么常量是没有进行过赋值的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,224评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,671评论 18 399
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,358评论 0 33
  • Advanced Language Features 知识点:一. static修饰符 static修饰符可以用来...
    风景凉阅读 3,290评论 0 0
  • 文/胡庄 豆豆很爱菲菲,并越来越爱了! 今天外出就餐时,别的阿姨一抱菲菲妹妹,豆豆哥哥就着急的和妈妈确认,妈妈,你...
    独立撰稿人胡庄阅读 2,967评论 3 2

友情链接更多精彩内容