技術のメモ箱

Java/クラス

クラス

クラスの宣言

クラスは変数やメソッドをまとめる入れ物。
クラスを利用するには、newでインスタンスを作成する。

コンストラクタは、インスタンスを生成する時に呼ばれる処理。
メソッド名の部分がクラス名と同じになり、戻り値の宣言が存在しない。

class Student {
    String name;

    Student(String name) {
        this.name = name;
    }

    String getName() {
        return name;
    }
}

ネステッドクラス

クラスの中で定義するクラスをネステッドクラスという。
ネステッドクラスを含んでいるクラスをアウタークラスという。
staticクラスはstaticなネステッドクラスを表す場合に使われる。
staticが付いていないクラスはインナークラスというが、インナークラスを使う機会は少ない。
クラスに付いたfinalは継承ができないことを表す。

インターフェース

インターフェースではフィールドを定義すると必ずpublic static finalになる。

interface Named {
    String name;
    default String greeting() {
        return "こんにちは%sさん".formatted(name());
    }
}

record Student(String name, int score) implements Named {}

関数型インターフェース

実装すべきメソッドが1つだけのインターフェースを関数型インターフェースという。
ラムダ式は、関数型インターフェースが必要なところに指定することができる。

作成したインタフェースが関数型インターフェースであることを明示するには、@FunctionalInterfaceアノテーションを付ける。
defaultメソッドはあってよいが、abstractメソッドは1つだけ。

Javaでは標準APIに関数型インターフェースがいくつか用意されている。

インターフェース名説明引数戻り値メソッド
Runnable処理を与えるなしなしvoid run()
Function<T, R>関数R apply(T)
Consumer<T>値を使った処理を行うなしvoid accept(T)
Predicate<T>判定するbooleanboolean test(T)
Supplier<T>値を生成するなしT get()
ActionListenerGUIイベントの処理ActionEventなしvoid actionPerformed(ActionEvent)


Functionインタフェースはジェネリクスで2つの方を指定するが、最初の型が引数、2番目の型が戻り値の型になる。

Function<String, String> greeting = s -> "こんにちは%sさん".formatted(s());
greeting.apply("miya");

継承

extendsで拡張する
インタフェースのimplementsも継承の一種
サブクラスはスーパークラスの一種である、という関係をis-a関係という。
スーパークラスの変数の初期化はスーパークラスで行うべきなので、サブクラスのコンストラクタでスーパークラスのコンストラクタを呼び出すようにする。
スーパークラスで定義されているメソッドをサブクラスで定義し直すことをオーバーライドという。
classの前にabstractを付けると抽象クラスになる。抽象クラスではないクラスは具象クラスという。
メソッドもabstractを付けると抽象メソッドになる。抽象メソッドは処理を持たずシグネチャだけを定義する。
抽象クラスはnewができない。

匿名クラス

クラスを継承したりインタフェースを実装したクラスを1回だけ使いたい場合に。
匿名クラスの多くはラムダ式に置き換えることができるとか。

new User() {
    @override
    String profile() {
      return null;
    }
}

パッケージ

静的インポート

static変数やstaticメソッドをクラス名を指定せず使用するためのインポート機能

package pack

public class Access1 {
    public static int num = 55;  // static変数
}
import static pack.Access1.num;  // staticを記述し、変数名・メソッド名または*を指定

public class Access2 {
    int num1 = num;  // クラス名が不要
}
pagetop