Kotlin学习(五):kotlin类详解进阶

【Android 详细知识点思维脑图(技能树)】我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。
摘要由CSDN通过智能技术生成
  • 4.java访问object单例

  • 4.kotlin中对应java的静态成员

  • 五、Kotlin内部类

    • 1.Java与Kotlin实现内部类方式比较
  • 2.Kotlin内名内部类

  • 六、Kotlin数据类data

    • 1.Java与Kotlin实现内部类方式比较
  • 2.data class 注意点

  • 七、枚举类EnumClass

    • 1.Java与Kotlin实现枚举类比较
  • 2.Kotlin枚举的简单使用

  • 八、密封类sealed class

    • 1.密封类概念
  • 2.密封类简单使用

  • 九、内联类inline

    • 1.内联类概念
  • 2.内联类定义

  • 3.内联类的限制

  • 4.内联类使用例子

  • 十、尝试使用component实现解构

  • 总结

一、kotlin类的构造器?

=================================================================================

1.构造器的基本写法与java对比?


示例:kotlin类构造器的常规写法

//大括号包含的即是kotlin的构造器了,声明了两个属性

//1.age 类内全局可见 2.构造器内(init块,属性初始化)

// 类的构造器 构造器参数 同时也定义了属性

class Person constructor(var age: Int, var str: String)

// 省略写法

class Person(var age: Int, name: String)

这么看下去有点懵?我们翻译成java代码看一下

示例:翻译为java代码如下

public final class Person {

private int age;

public final int getAge() {

return this.age;

}

public final void setAge(int var1) {

this.age = var1;

}

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

Intrinsics.checkNotNullParameter(name, “name”);

super();

this.age = age;

}

}

这就看得懂了吧,java需要这么多行的代码,kotlin一行就搞定了。是不是很方便。

那有些小伙伴就问了,那如果我想在java的构造函数中处理一些逻辑,kotlin怎么做到的呢?

那这个时候init代码块就出现了,具体是什么,我们一块来看看吧~

2.init代码块


示例:init代码块

class Person(var age: Int, name: String) {

var name: String? = null

init {

println(name)

}

init {

val nameStr = name

this.name = nameStr

}

}

我们可以看到init代码块可以访问到构造器传入的参数,那么他是怎么样被调用的呢?对应的java代码是什么呢?我们反编译成java代码看一下

public final class Person {

@Nullable

private String name;

private int age;

@Nullable

public final String getName() {

return this.name;

}

public final void setName(@Nullable String var1) {

this.name = var1;

}

public final int getAge() {

return this.age;

}

public final void setAge(int var1) {

this.age = var1;

}

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

Intrinsics.checkNotNullParameter(name, “name”);

super();

this.age = age;

boolean var3 = false;

System.out.println(name);

this.name = name;

}

}

可以很明显的看出,init代码块在Java平台其实就是相当于构造函数的执行体,且如果有多个init块,是按照顺序在构造函数中执行的。

3.kotlin副构造器


定义:定义了主构造器后在类内部定义的构造器统称为副构造器(定义的副构造器需要调用自身(最终调用到主构造器)或者父类的构造器)

示例:副构造器的简单示例

class Person(var age: Int, name: String) {

constructor(age: Int) : this(age, “zxf”){

println(“i am sub-constructor”)

}

init {

println(name)

}

}

我们看一下对应的java代码如何

public final class Person {

private int age;

public final int getAge() {

return this.age;

}

public final void setAge(int var1) {

this.age = var1;

}

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

Intrinsics.checkNotNullParameter(name, “name”);

super();

this.age = age;

boolean var3 = false;

System.out.println(name);

}

public Person(int age) {

this(age, “zxf”);

String var2 = “i am sub-constructor”;

boolean var3 = false;

System.out.println(var2);

}

}

对应的java代码其实就是声明了一个对应的构造器,且调用了“主”构造器。

另外看得出,init代码块只在主构造器中被调用,且因为副构造器代码块中的第一行代码。首先调用了“主”构造器。

所以代码执行顺序:init代码块要先与副构造器执行

4.kotlin构造器的推荐使用方式


  • 不推荐不定义主构造器只定义副构造器

  • 推荐主构造器填上默认参数

推荐示例

class Person(var age: Int, name: String = “zxf”)

//主构造器默认参数在java代码中可以以重载的形式调用

class Person1 @JvmOverloads constructor(var age: Int, name: String = “zxf”, height: Int = 185)

二、Kotlin与Java类与成员的可见性对比?

===========================================================================================

1.Kotlin与Java可见性修饰符对比?


可见性表格对比:

| 可见性对比 | Java | Kotlin |

| — | — | — |

| public | 公开 | 与java相同,默认即为public |

| internal | × | 模块内可见 |

| default | 包内可见,默认 | × |

| protected | 包内以及子类可见 | 类内以及子类可见(不可修饰顶级类) |

| private | 类内可见 | 类内或者文件内可见 |

模块内通常来说是一个jar包或者aar,比如:

  • Intellij IDEA 模块

  • Maven 工程

  • Gradle SourceSet

  • Ant 任务中一次调用 文件

下面针对kotlin的特有的修饰符,看一下可修饰的对象

| 可见性类型 | 顶级声明 | 类 | 成员 |

| — | —

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值