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> | 判定する | 有 | boolean | boolean test(T) |
Supplier<T> | 値を生成する | なし | 有 | T get() |
ActionListener | GUIイベントの処理 | 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; // クラス名が不要
}