ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
インターフェースの基本
// 定義
public interface Animal {
void sound(); // public abstract が自動付与
int legs();
}
// 実装
public class Dog implements Animal {
@Override
public void sound() {
System.out.println("Wan!");
}
@Override
public int legs() { return 4; }
}
// 多重実装
public interface Swimmer { void swim(); }
public interface Flyer { void fly(); }
public class Duck implements Animal, Swimmer, Flyer {
public void sound() { ... }
public int legs() { return 2; }
public void swim() { ... }
public void fly() { ... }
}
暗黙の修飾子
| 宣言 | 暗黙で付く修飾子 |
|---|---|
| フィールド | public static final (定数) |
| 抽象メソッド | public abstract |
| default メソッド (Java 8+) | public |
| static メソッド (Java 8+) | public |
| ネスト型 | public static |
public interface Config {
int TIMEOUT = 30; // public static final が自動付与
String VERSION = "1.0"; // 同じ
void load(); // public abstract が自動付与
}
default メソッド (Java 8+)
既存インターフェースに後付けで実装を追加してもサブクラスを壊さないようにするため Java 8 で導入されました。
public interface Logger {
void log(String msg);
// ★ default メソッド = デフォルト実装あり
default void info(String msg) { log("[INFO] " + msg); }
default void warn(String msg) { log("[WARN] " + msg); }
default void error(String msg) { log("[ERROR] " + msg); }
}
public class ConsoleLogger implements Logger {
@Override
public void log(String msg) {
System.out.println(msg);
}
// info / warn / error は実装不要
}
// 必要なら override も可
public class CustomLogger implements Logger {
@Override public void log(String msg) { ... }
@Override public void error(String msg) {
Sentry.capture(msg);
Logger.super.error(msg); // 親 default 呼び出し
}
}
static メソッド (Java 8+)
public interface StringUtils {
static boolean isEmpty(String s) {
return s == null || s.isEmpty();
}
static String reverse(String s) {
return new StringBuilder(s).reverse().toString();
}
}
// 呼び出し方
StringUtils.isEmpty(""); // true
StringUtils.reverse("abc"); // "cba"
// インスタンスからは呼べない
// new SomeClass().isEmpty(); // ❌
private メソッド (Java 9+)
public interface Validator {
boolean validate(String input);
default boolean validateAll(List<String> inputs) {
return inputs.stream().allMatch(this::validate);
}
default boolean validateAny(List<String> inputs) {
return inputs.stream().anyMatch(this::validate);
}
// ★ Java 9+ private で内部ヘルパ
private boolean isNotEmpty(String s) {
return s != null && !s.isEmpty();
}
}
Functional Interface とラムダ式
抽象メソッドがちょうど 1 つのインターフェースを Functional Interface と呼びます。@FunctionalInterface アノテーションで強制できます。ラムダ式は Functional Interface に対する糖衣構文です。
@FunctionalInterface
public interface Transformer<T, R> {
R transform(T input);
}
// ラムダで実装
Transformer<String, Integer> length = s -> s.length();
length.transform("hello"); // 5
// メソッド参照
Transformer<String, Integer> length2 = String::length;
// 標準 Functional Interface (java.util.function)
Function<String, Integer> f = String::length;
Predicate<String> isEmpty = String::isEmpty;
Consumer<String> print = System.out::println;
Supplier<String> get = () -> "hello";
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
// Stream API はラムダ前提
list.stream()
.filter(s -> s.length() > 3)
.map(String::toUpperCase)
.forEach(System.out::println);
Marker Interface (マーカーインターフェース)
メソッドを持たず、「この型はこの能力を持つ」とマークするだけのインターフェース。代表は Serializable, Cloneable, RandomAccess。
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
}
// 現代では Marker より @Annotation を使うことが多い
@MyMarker
public class MyClass { ... }
抽象クラスとの違い
| 項目 | インターフェース | 抽象クラス |
|---|---|---|
| キーワード | interface / implements | abstract class / extends |
| 複数継承 | ★ 多重実装 OK | 単一継承のみ |
| フィールド | public static final のみ (定数) | インスタンスフィールド可 |
| メソッド | 抽象 + default + static + private | 抽象 + 通常メソッド |
| コンストラクタ | 不可 | あり |
| 用途 | 「〜できる」 (能力) | 「〜は〜である」 (Is-A 関係) + 共通実装 |
Sealed Interface (Java 17+)
実装できるクラスを限定する Sealed Type が Java 17 で正式リリース:
public sealed interface Shape
permits Circle, Square, Triangle {}
public final class Circle implements Shape { ... }
public final class Square implements Shape { ... }
public final class Triangle implements Shape { ... }
// パターンマッチ switch (Java 21+) で網羅性チェック
double area(Shape s) {
return switch (s) {
case Circle c -> Math.PI * c.radius() * c.radius();
case Square sq -> sq.side() * sq.side();
case Triangle t -> t.base() * t.height() / 2;
// default 不要 (sealed なのでコンパイラが網羅検証)
};
}
多重実装で同名 default メソッドが衝突した場合
interface A {
default String name() { return "A"; }
}
interface B {
default String name() { return "B"; }
}
// ❌ コンパイルエラー: どちらか不明
class C implements A, B { }
// ✅ 明示的に解決
class C implements A, B {
@Override
public String name() {
return A.super.name() + "+" + B.super.name();
}
}
FAQ
Q: いつインターフェース、いつ抽象クラス?
A: 「〜できる」「契約」ならインターフェース。「〜は〜である」+ 共通の実装やフィールドを持たせたいなら抽象クラス。
Q: default メソッドを乱用していい?
A: 後付けの拡張には便利だが、新規設計では責務が混じりがち。コア API は抽象メソッドのまま、ユーティリティは static にした方が綺麗。
Q: @FunctionalInterface は必須?
A: 任意。ただし付けると抽象メソッドが 2 つ以上になったときコンパイルエラーになり、契約破壊を防げます。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?