🥜

companion object, static 軽くまとめ

2023/12/06に公開

Java Static

  • クラス内のメンバー変数を使うためには、クラスを作成し、インスタンス。変数の形で呼び出すことで使用できます。
  • 複数のインスタンスを作成する際に、それぞれのメンバー変数が保存されるメモリを使います。
  • ただし、すべてのインスタンスで共通で使用する変数がある場合は、複数のメモリを使うのは非効率的になる可能性があります。
  • これを解決するためには、static変数、メソッドを使用して、そのクラスのすべてのインスタンスで共通で使うことができます。
class Student {
    public String id;
    public String name;
    public static String national;

    public static void printInfo(){
        System.out.printf("printInfo");
    }
}

public class Main {
    public static void main(String[] args) {

        Student.national = "korea";
        Student.printInfo();
    }
}

Staticキーワードが付けられた変数またはメソッドはコンパイル後、クラスローディング時点でクラスのようにクラス変数もメモリを占めるようになります。 Static変数やメソッドはクラス。変数として使用できます。

Companion Object

  • Javaのstaticをなくし、kotlinではCompanion Objectという同伴オブジェクトを使用して静的メンバーを定義します。
  • また、Companionに名前を設定してカスタムしたCompanionObjectを作成することもできます。
class Student{
    var id: String? = null
    var name: String? = null

    companion object{
        val national = "Liverpool"

        fun printnational(){
            println(national)
        }
    }
}

fun main(){
    println(Student.Companion.national)
    Student.Companion.printnational()

    val comp = Student.Companion
    println(comp.national)
    comp.printnational()

    val comp2 = Student
    println(comp2.national)
    comp2.printnational()
}
  • Javaのstaticとは少し違があります。CompanionObjectとしてオブジェクトなので変数に割り当てることができます。
  • 1つのクラスでは、1つのCompanionObjectだけを生成できます。
  • Companion Object内部変数はクラス内で使用できます。 ただし、クラスメンバー変数はCompanion Object内では使用できません。 Companion Objectはクラスローディング中に生成されますが、クラスメンバー変数はクラスインスタンス生成時に生成されるため、メンバー変数は使用できません。
public final class Student {
   @Nullable
   private String id;
   @Nullable
   private String name;
   @NotNull
   private static final String national = "Liverpool";
   public static final Student.Companion Companion = new Student.Companion((DefaultConstructorMarker)null);

   @Nullable
   public final String getId() {
      return this.id;
   }

   public final void setId(@Nullable String var1) {
      this.id = var1;
   }

   @Nullable
   public final String getName() {
      return this.name;
   }

   public final void setName(@Nullable String var1) {
      this.name = var1;
   }

   public static final class Companion {
      @NotNull
      public final String getNational() {
         return Student.national;
      }

      public final void printnational() {
         String var1 = ((Student.Companion)this).getNational();
         boolean var2 = false;
         System.out.println(var1);
      }

      private Companion() {
      }

      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}

JavaでDecompileしてみると、Studentクラス内部にstaticでCompanionクラスを生成することが確認できます。 これにより、Companionオブジェクトは、クラスが生成されるときにメモリに積載され、同時に生成されるオブジェクトであることがわかります。

Discussion