总结:
kotlin不支持static关键字,所有java中的static的field, method,都可以转换成companion object里边的field和method。
另外,在java中,在class里边生成的static field和method一般有两种可见性,一种是public的, 一种是private的。public表示全局访问,这没什么问题。如果是private的,那表示只有该class对应的object instance才可以访问,比如那些只有该类才可以访问的常量。对应的kotlin object就是,java中的private static final对应的是kotlin companion object里边的private val变量,甚至是private const修饰的。
比如下边的代码:
class OuterClass {
val outerName = "outer tom"
companion object {
var age = 44
const val name = "inner tom"
private const val sex = "man"
fun printName() {
println("inner name is $name, age is $age")
}
}
}
对应的java代码如下:
import kotlin.Metadata;
import kotlin.jvm.internal.DefaultConstructorMarker;
import org.jetbrains.annotations.NotNull;
public final class OuterClass {
@NotNull
private final String outerName = "outer tom";
private static int age = 44;
@NotNull
public static final String name = "inner tom";
private static final String sex = "man";
@NotNull
public static final OuterClass.Companion Companion = new OuterClass.Companion((DefaultConstructorMarker)null);
@NotNull
public final String getOuterName() {
return this.outerName;
}
public static final class Companion {
public final int getAge() {
return OuterClass.age;
}
public final void setAge(int var1) {
OuterClass.age = var1;
}
public final void printName() {
String var1 = "inner name is inner tom, age is " + ((OuterClass.Companion)this).getAge();
System.out.println(var1);
}
private Companion() {
}
// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
可以看到,companion object里边的三个feild - name, age, sex都被挪到外部了,并且都是 static final的,只不过age由于是没有使用const修饰,还有getter,setter方法,这也是为什么idea会推荐加上const关键字。sex有Private修饰,表示只有本包下可以访问。