1. 序章

この短いチュートリアルでは、JavaとKotlinのvarキーワードの違いについて説明します。

Javaの識別子varについては、記事 Java 10 LocalVariable Type-Inference で詳しく説明し、Kotlinのキーワードvarについては記事で説明します。 Kotlin const、var、およびvalキーワード

2. オプションの型宣言と型宣言なし

2.1. Kotlin

可変変数を宣言し、同時に初期化する場合は、次のタイプを指定する必要はありません。

var myVariable = 1

ただし、次のことを選択した場合は、これを行うことができます。

var myVariable : Int = 1

変数を直接初期化せずに宣言する場合は、そのタイプを指定する必要があり、後で値を割り当てることができます。

var myVariable : Int
myVariable = 1

2.2. Java

Javaでは、変数をその場で初期化する場合にのみ var を使用でき、次のようにしたとしても型情報を提供することはできません。

var myVariable = 1;

以下は無効です。

var myVariable;
myVariable = 1;

そして、コンパイル時エラーが発生します。

Cannot infer type: 'var' on variable without initializer

3. キーワードと識別子

Kotlinでは、 var はキーワードです。つまり、変数、パラメーター、メソッド、またはクラスの名前として使用することはできません。 対照的に、Java 10は、varを特別な意味を持つ識別子として定義します。

つまり、Java 10でも、 var という名前の変数、パラメーター、またはメソッドを定義できます。

public void var() {
    // do something
}

public void method(int var) {
    // do something
}

public void method() {
    int var = 1;
    // do something
}

Java 10以降、varという名前のクラスを定義することはできなくなったことを覚えておいてください。

public static class var {
}

上記のコードにより、コンパイル時エラーが発生します。

Error:(1, 1) java: 'var' not allowed here
  as of release 10, 'var' is a restricted type name and cannot be used for type declarations

これにより、古いバージョンのJavaとの下位互換性が確保されます。

4. 可変性

Kotlinでvarで宣言された変数は常に変更可能ですが、Javaでvarで宣言された変数は変更可能またはfinalにすることができます。

var mutableInt = 1;
final var immutableInt = 1;

Kotlinには、 final キーワードはありません—final変数は代わりにvalで宣言されます。

val immutableInt = 1

5. グローバルとローカルの使用

5.1. Kotlin

Kotlinでは、 var を使用して、グローバル変数とローカル変数、およびクラスメンバーを宣言できます。

var myGlobalVar = 3

class MyClass {

    var myVar = 3    

    public fun myFunction() : Int {
        var myVariable = 3
        return myVariable
    }
}

5.2. Java

Javaでは、 var は、ローカル変数を宣言するためにのみ使用できます。

public class MyClass {

    //not possible for member variables
    //private var myVar = 1;

    public int myFunction() {
        var myVariable = 3;
        return myVariable;
    }
}

6. 結論

この記事では、KotlinとJavaのvarの違いについて説明しました。 どちらも非常によく似ていますが、2つの間に根本的な違いがあります。

最も重要な違いは、Kotlinの var は可変性に関するものであり、Javaのvarは型推論に関するものであるということです。