将普通类的class
直接替换为object
即创建单例类
单例类调用方法语法:类名.方法名(与Java调用类的静态方法一致)
class MyClass {
private val i = 1
fun printI(){
println(i)
}
}
//调用
fun main(array: Array<String>) {
MyClass().printI()
}
转换成java代码如下(AS:Tools - Kotlin - show Kotlin Bytecode 单击Decompile按钮)
public final class MyClass {
private final int i = 1;
public final void printI() {
int var1 = this.i;
boolean var2 = false;
System.out.println(var1);
}
}
替换如下
object MyClass {
private val i = 1
fun printI(){
println(i)
}
}
//调用
fun main(array: Array<String>) {
MyClass.printI()
}
转换成java代码如下
public final class MyClass {
private static final int i = 1;
public static final MyClass INSTANCE;
public final void printI() {
int var1 = i;
boolean var2 = false;
System.out.println(var1);
}
private MyClass() {
}
static {
MyClass var0 = new MyClass();
INSTANCE = var0;
i = 1;
}
}
可见类似Java创建单例
将普通类的方法调用转换为Java代码
public final class WelcomeKt {
public static final void main(@NotNull String[] array) {
Intrinsics.checkParameterIsNotNull(array, "array");
(new MyClass()).printI();
}
}
中规中矩
将单例类的方法调用转换为Java代码
public final class WelcomeKt {
public static final void main(@NotNull String[] array) {
Intrinsics.checkParameterIsNotNull(array, "array");
MyClass.INSTANCE.printI();
}
}
可见其调用为:该类的单例对象调用方法。即一个对自己持有引用的静态成员调用了方法
2020.4.15
使用单例类的写法会将整个类中的方法全部变为类似静态方法, 但有时候需求是只希望某类的某个方法变为静态方法, 可使用companion object
举个例子
class MyClass {
fun printI(a: Int){
println("The value is $a")
}
companion object{
fun printII(a: Int){
println("The value is $a")
}
}
}
调用和Java调用某类静态方法一致
注意: 这里只是使用MyClass的伴生对象调用方法, 与实际静态方法还是有区别的
如果需要定义真正的静态方法, 可以将方法定义为顶层方法(创建xxx.kt文件). 对于在顶层方法中的方法, Kotlin编译器会把所有顶层方法编译为静态方法, 所有的顶层方法都可以在任意位置被直接调用, 不用管包名, 也不用创建实例