【KotlinとJava】オブジェクト指向な「Hello, world」

05 オブジェクト指向な「Hello, world」

KotlinとJava

やっとクラスが出てきた。このサンプルには実に様々な要素が詰め込まれている。少しづつ紐解いていこう。

An object-oriented Hello.kt

class Greeter(private val name: String) {  
    fun greet() {  
        println("Hello, $name")  
    }  
}  
  
fun main(args: Array<String>) {  
    Greeter(args[0]).greet()  
}

リンク

クラス

まずはクラスの宣言からだ。クラス名Greeterの後ろに(private val name: String)といった引数がついている。これは、クラスの宣言と同時に、コンストラクタを宣言しているのだ。引数付きのコンストラクタであるから、もちろんデフォルトコンストラクタは利用できなくなる。

さて、name: Stringはどのような扱いになるのか気になるのではないだろうか?これはnameというメンバー変数が作られるのだ。greetメソッドを見てみると、nameメンバー変数にアクセスしているのがわかるはずだ。

次は呼び出し側についてみていこう。Kotlinではインスタンスを生成するために、newキーワードは必要ない。クラス名()とすることでインスタンスを生成できる。もちろん、生成したインスタンスを変数に格納することも可能だ。

変数

val name: Stringvalに注目してほしい。kotlinにおいて、変数の宣言は2種類の方法がある。違いは代入した後に中身を変えられるかどうかだ。

var Chanable = "OK!"      // 再代入可能
val canNotChange = "NG!"  // 再代入不可能

: Stringが付いていないのに気が付いただろうか?上記のように宣言と同時に値が決まる場合、コンパイラが自動的に型を判断してくれるため、型を記述する必要はない(もちろん記述してもよいが冗長であるとヒントが出る)。関数やメソッドの引数の場合は判断することができないため、型を記述する必要がある。

Javaで記述

public class Greeter {  
    private final String name;  
  
    public Greeter(String name) {  
        this.name = name;  
    }  
  
    public void greet() {  
        System.out.println(String.format("Hello, %s", this.name));  
    }  
}

public class Exp05 {  
    public static void main(String[] args) {  
        new Greeter(args[0]).greet();  
    }  
}

private final String nameのときに初期化をしなくても大丈夫かって?コンストラクタで初期化を行えば間に合うんだよね。

コメント

このブログの人気の投稿

【KotlinとJava】分解宣言

wxPythonでのモーダルダイアログ作成