-
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类构造器的常规写法
//大括号包含的即是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代码块就出现了,具体是什么,我们一块来看看吧~
示例: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块,是按照顺序在构造函数中执行的。
定义:定义了主构造器后在类内部定义的构造器统称为副构造器(定义的副构造器需要调用自身(最终调用到主构造器)或者父类的构造器)
示例:副构造器的简单示例
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代码块要先与副构造器执行。
-
不推荐不定义主构造器只定义副构造器
-
推荐主构造器填上默认参数
推荐示例
class Person(var age: Int, name: String = “zxf”)
//主构造器默认参数在java代码中可以以重载的形式调用
class Person1 @JvmOverloads constructor(var age: Int, name: String = “zxf”, height: Int = 185)
===========================================================================================
可见性表格对比:
| 可见性对比 | Java | Kotlin |
| — | — | — |
| public | 公开 | 与java相同,默认即为public |
| internal | × | 模块内可见 |
| default | 包内可见,默认 | × |
| protected | 包内以及子类可见 | 类内以及子类可见(不可修饰顶级类) |
| private | 类内可见 | 类内或者文件内可见 |
模块内通常来说是一个jar包或者aar,比如:
-
Intellij IDEA 模块
-
Maven 工程
-
Gradle SourceSet
-
Ant 任务中一次调用 文件
下面针对kotlin的特有的修饰符,看一下可修饰的对象
| 可见性类型 | 顶级声明 | 类 | 成员 |
| — | —