companion object和object 从kotlin转java分析

说明

companion object 中
companion类中的方法是普通的方法
在外部类中生成静态变量,静态companion 对象

object MyClass2 中
类中方法是普通方法
在MyClass2中生成静态变量,静态MyClass2对象,

一 companion object 使用 kotlin转java


package test.e

class Test1 {


}

fun main() {
//    MyClass.MyClass2.printHello()
    MyClass.printHello()

}
class MyClass {

    var a  =10

   companion  object  {

        var b =1
//        @JvmStatic
        fun printHello() {
            println("Hello, World!")
        }
    }
}


 调用方法
//MyClass.printHello()


------------------------------------------
// Test1.java
package test.e;

import kotlin.Metadata;

@Metadata(
   mv = {2, 0, 0},
   k = 1,
   xi = 48,
   d1 = {"\u0000\f\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\u0018\u00002\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0002¨\u0006\u0003"},
   d2 = {"Ltest/e/Test1;", "", "()V", "untitled"}
)
public final class Test1 {
}
// MyClass.java
package test.e;

import kotlin.Metadata;
import kotlin.jvm.internal.DefaultConstructorMarker;
import org.jetbrains.annotations.NotNull;

@Metadata(
   mv = {2, 0, 0},
   k = 1,
   xi = 48,
   d1 = {"\u0000\u0014\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\b\n\u0002\b\u0006\u0018\u0000 \t2\u00020\u0001:\u0001\tB\u0005¢\u0006\u0002\u0010\u0002R\u001a\u0010\u0003\u001a\u00020\u0004X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u0005\u0010\u0006\"\u0004\b\u0007\u0010\b¨\u0006\n"},
   d2 = {"Ltest/e/MyClass;", "", "()V", "a", "", "getA", "()I", "setA", "(I)V", "Companion", "untitled"}
)
public final class MyClass {
   @NotNull
   **public static final Companion Companion = new Companion((DefaultConstructorMarker)null);**
   private int a = 10;
   private static int b = 1;

   public final int getA() {
      return this.a;
   }

   public final void setA(int var1) {
      this.a = var1;
   }

   @Metadata(
      mv = {2, 0, 0},
      k = 1,
      xi = 48,
      d1 = {"\u0000\u001a\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\b\n\u0002\b\u0005\n\u0002\u0010\u0002\n\u0000\b\u0086\u0003\u0018\u00002\u00020\u0001B\u0007\b\u0002¢\u0006\u0002\u0010\u0002J\u0006\u0010\t\u001a\u00020\nR\u001a\u0010\u0003\u001a\u00020\u0004X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u0005\u0010\u0006\"\u0004\b\u0007\u0010\b¨\u0006\u000b"},
      d2 = {"Ltest/e/MyClass$Companion;", "", "()V", "b", "", "getB", "()I", "setB", "(I)V", "printHello", "", "untitled"}
   )
   public static final class Companion {
      private Companion() {
      }

      public final int getB() {
         return MyClass.b;
      }

      public final void setB(int var1) {
         MyClass.b = var1;
      }

      public final void printHello() {
         String var1 = "Hello, World!";
         System.out.println(var1);
      }

      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}
// Test1Kt.java
package test.e;

import kotlin.Metadata;

@Metadata(
   mv = {2, 0, 0},
   k = 2,
   xi = 48,
   d1 = {"\u0000\b\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a\u0006\u0010\u0000\u001a\u00020\u0001¨\u0006\u0002"},
   d2 = {"main", "", "untitled"}
)
public final class Test1Kt {
   public static final void main() {
      MyClass.Companion.printHello();
   }

   // $FF: synthetic method
   public static void main(String[] args) {
      main();
   }
}

二 object kotlin转java

package test.e

class Test1 {

}

fun main() {
    MyClass.MyClass2.printHello()
//    MyClass.printHello()

}
class MyClass {

    var a  =10

     object MyClass2 {
        var b =1
//        @JvmStatic
        fun printHello() {
            println("Hello, World!")
        }
    }
}


 调用方法
//MyClass.printHello()

------------------------------
// Test1.java
package test.e;

import kotlin.Metadata;

@Metadata(
   mv = {2, 0, 0},
   k = 1,
   xi = 48,
   d1 = {"\u0000\f\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\u0018\u00002\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0002¨\u0006\u0003"},
   d2 = {"Ltest/e/Test1;", "", "()V", "untitled"}
)
public final class Test1 {
}
// MyClass.java
package test.e;

import kotlin.Metadata;
import org.jetbrains.annotations.NotNull;

@Metadata(
   mv = {2, 0, 0},
   k = 1,
   xi = 48,
   d1 = {"\u0000\u0014\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\b\n\u0002\b\u0006\u0018\u00002\u00020\u0001:\u0001\tB\u0005¢\u0006\u0002\u0010\u0002R\u001a\u0010\u0003\u001a\u00020\u0004X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u0005\u0010\u0006\"\u0004\b\u0007\u0010\b¨\u0006\n"},
   d2 = {"Ltest/e/MyClass;", "", "()V", "a", "", "getA", "()I", "setA", "(I)V", "MyClass2", "untitled"}
)
public final class MyClass {
   private int a = 10;

   public final int getA() {
      return this.a;
   }

   public final void setA(int var1) {
      this.a = var1;
   }

   @Metadata(
      mv = {2, 0, 0},
      k = 1,
      xi = 48,
      d1 = {"\u0000\u001a\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\b\n\u0002\b\u0005\n\u0002\u0010\u0002\n\u0000\bÆ\u0002\u0018\u00002\u00020\u0001B\u0007\b\u0002¢\u0006\u0002\u0010\u0002J\u0006\u0010\t\u001a\u00020\nR\u001a\u0010\u0003\u001a\u00020\u0004X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u0005\u0010\u0006\"\u0004\b\u0007\u0010\b¨\u0006\u000b"},
      d2 = {"Ltest/e/MyClass$MyClass2;", "", "()V", "b", "", "getB", "()I", "setB", "(I)V", "printHello", "", "untitled"}
   )
   public static final class MyClass2 {
      @NotNull
      **public static final MyClass2 INSTANCE = new MyClass2();**
      private static int b = 1;

      private MyClass2() {
      }

      public final int getB() {
         return b;
      }

      public final void setB(int var1) {
         b = var1;
      }

      public final void printHello() {
         String var1 = "Hello, World!";
         System.out.println(var1);
      }
   }
}
// Test1Kt.java
package test.e;

import kotlin.Metadata;

@Metadata(
   mv = {2, 0, 0},
   k = 2,
   xi = 48,
   d1 = {"\u0000\b\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a\u0006\u0010\u0000\u001a\u00020\u0001¨\u0006\u0002"},
   d2 = {"main", "", "untitled"}
)
public final class Test1Kt {
   public static final void main() {
      MyClass.MyClass2.INSTANCE.printHello();
   }

   // $FF: synthetic method
   public static void main(String[] args) {
      main();
   }
}


Kotlin中的objectcompanion object是两种不同的声明方式,它们各自适用于不同的场景。 首先,object关键字用于创建一个单例对象。它适用于只需要一个实例的类,例如全局的工具类或管理类。通过使用object关键字,我们可以将类声明为对象,并可以直接访问其中的方法属性,而无需创建该类的实例。这种方式非常方便,尤其适用于需要在整个应用程序中共享的实例。 另一方面,companion object是在类内部使用的一种特殊对象声明方式。它可以访问类的私有成员,类似于Java中的静态成员。使用companion object可以创建类级别的方法属性,而不是实例级别的。它适用于需要在类级别上访问某些成员的场景。 使用companion object可以实现工厂模式,因为它允许在类的伴生对象中定义一个或多个工厂方法来创建类的实例,这些方法可以直接访问类的私有构造函数。这样,我们就可以将对象的创建逻辑封装在类内部,提供更好的封装灵活性。 另外,当我们需要在一个类中创建实例时,但不希望这个类的名称在外部可见时,也可以使用companion object。这在一些设计模式中非常有用,例如单例模式或工厂模式。 总而言之,kotlin object适用于创建单例对象,而companion object适用于在类级别上访问某些成员或实现工厂模式。根据不同的需求,我们可以选择恰当的方式来使用这两种声明方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值