Javaのクラスとインタフェースまとめ

僕が初めて学んだプログラミング言語は「Java」! veilnuiです!
C#を取得してから、全くJavaに触れなくなりました。
風化する前に残しておきたくて書きました。

クラス

Javaはクラスベースのプログラミング言語です。
どのようなプログラムでも必ず「クラス」を定義する必要があります。

これがJavaの最も一般的なクラス宣言文です。

// 最も一般的なクラス宣言
public class クラス名 {
}

注意点は2つです。例外もあります。

  • ファイル名は「クラス名.java」でなければならない
  • 1つのファイルには1つのクラスだけ定義できる

アクセス修飾子

クラスには2種類のアクセス修飾子を付けられます。

publicすべてのクラスからアクセス可能
package private同一パッケージ内のクラスのみアクセス可能

「Javaのファイル名は『クラス名.java』で、1つのファイルに1つのクラス」ですが、これは「public」の場合です。

「package private」は、1つのファイルに複数のクラスを宣言できます。
また、ファイル名も自由です。

// アクセス修飾子が「public」のクラス
// ファイル名は「Public.java」
// 1つのファイルに1つのクラス
public class Public {
}

// アクセス修飾子が「package private」のクラス
// ファイル名は自由
// 1つのファイルに複数のクラス
class PackagePublic {
}

継承禁止のクラス

「finalキーワード」を使うことで、継承禁止にできます。
なお、抽象クラスはには「finalキーワード」が使えません。

public final class Final {
}

クラスの継承とインタフェースの実装

Javaでは、クラスの継承やインタフェースの実装ができます。

クラスの継承

Javaでは「extendsキーワード」でクラスの継承ができます。
なお、Javaでは「多重継承」ができません。

public class Sub extends Super {
}

extendsキーワードで親クラスを指定しない場合は「java.lang.Objectクラス」を自動で継承します。

インタフェースの実装

Javaでは「implementsキーワード」でインタフェースの実装ができます。

public class Class implements Interface1, Interface2 ... {
}

インタフェースは「多重継承」ができます。

クラスの継承とインタフェースの実装を同時に

クラスの継承とインタフェースの実装を同時に行うこともできる。
順番は「クラスが先で、インタフェースは後」です。

public class Sub extends Super implements Interface1, Interface2 ... {
}

例外クラス

Javaでは、例外クラスを定義することができます。
特別な構文はありません。次の4つのクラスのうち、どれか1つを継承すれば例外クラスになります。

例外クラスはすべて「java.lang.Throwable」を親クラスとして持ちます。

Throwable例外クラスのルートクラス
Errorエラー例外のクラス
Exception通常例外のクラス
RuntimeExceptionランタイム例外のクラス

Throwable

すべての例外クラスのルートクラスです。
ですが、このクラスを直接継承することはないです。

Error

エラー例外のクラスです。Throwableクラスを継承しています。
このクラスを継承して例外クラスを定義することはあまりありません。

なお、Errorクラスを継承する例外クラスは、スローされるとJVMが即時停止します。

Exception

通常の例外のクラスです。Throwableクラスを継承しています。
一般的に例外クラスを定義するときは、このクラスを継承することが多いです。

なお、このクラスを継承する例外クラスは「try-catch-finally構文」で例外を処理するか「throwsキーワード」でスロー宣言をする必要があります。

RuntimeException

ランタイム例外のクラスです。Exceptionクラスを継承しています。

通常の例外とは違い「try-catch-finally構文」や「throwsキーワード」などで例外処理をする必要はありません。

抽象クラス

抽象メソッドを含むクラスは「抽象クラス」として定義しなくてはいけません。

抽象クラスは「newキーワード」による「インスタンス化」ができなくなります。
また、クラス宣言で「finalキーワード(=継承禁止)」は使えません。

public abstract class 抽象クラス名 {
}

なお、クラスの継承やインタフェースの実装はできます。

public abstract class Abstract extends Super implements Interface1, Interface2 ... {
}

インタフェース

抽象メソッドと定数フィールドだけで構成されるクラスは「インタフェース」として定義できます。

public interface インタフェース名 {
}

インタフェースの継承

インタフェースは、他のインターフェースを継承できます(多重継承もできる)。
なお、インターフェースが、他のクラスを継承することはできません。

public interface Sub extends Interface1, Interface2 ... {
}

注意点としては、キーワードが「extends」です。「implements」ではありません。

SAMインターフェース

抽象メソッドを1つだけ持つインターフェースのことを、別名で「SAMインターフェース」です。
「Single Abstract Method」で「SAM」です。

SAMインターフェースは、関数を第一級オブジェクトとして扱うときに必要です。

インナークラス

クラスは、次の場所でも宣言できます。

  • クラス内(メンバクラス)
  • メソッド内(ローカルクラス)
  • 文内(匿名クラス)

インナークラスを使用すると、ソースが複雑になります。
インナークラスを使うくらいなら、package privateクラスを使ったほうが良いです。

メンバクラス

他のクラスの中で、クラスを定義できます。
「staticキーワード」で静的メンバクラスとして定義することもできます。

public class Out {
  // これがメンバクラス
  public class In {
  }
}

アクセス方法は「外側のインスタンス.内側のクラス」です。

public class Out {
  // これが静的メンバクラス
  public static class In {
  }
}

静的メンバクラスの場合は「外側のクラス.内側のクラス」です。

メンバクラスは、基本機能は通常のクラスと同じです。

ローカルクラス

メソッド内に定義できます。

public class Main {
  public void out {
    // これがローカルクラス
    class In {
    }
  }
}

注意点は3つです。

  • メソッド内でしか使えない
  • finalキーワード、abstractキーワードは付けられない
  • アクセス修飾子は付けられない

それ以外は普通のクラスと同じです。

匿名クラス

文中に定義できます。使い捨てのインスタンスを生み出すときに使います。

「public」「final」「abstract」などは、一切使えません。

// 匿名クラスの構文
new 継承する親クラス () {
}
public class Main {
  public void main() {
    // これが匿名クラス
    Object object = new Object() {
    }
  }
}

Java8で「ラムダ式」が導入されたため、匿名クラスを使う機会は皆無になりましたwww

コメント

タイトルとURLをコピーしました