【KotlinとJava】オブジェクト指向な「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: String
のval
に注目してほしい。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
のときに初期化をしなくても大丈夫かって?コンストラクタで初期化を行えば間に合うんだよね。
コメント
コメントを投稿