赞
踩
总结:
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修饰,表示只有本包下可以访问。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。