静的コードブロック
public class Employee {
//2
{
System.out.println("初期化ブロック");
}
//1 一度だけ実行
static {
System.out.println("静的コードブロック");
}
//3
public Employee() {
System.out.println("コンストラクタ");
}
}
実行順序は、まず静的コードブロック(一度のみ)、次に初期化ブロック、最後にコンストラクタとなります。
抽象クラス
public abstract class Animal {
//制約として機能し、サブクラスによる実装を要求
//抽象メソッドは宣言のみで実装は持たない
public abstract void makeSound();
public String species;
//初期化用
public Animal(String species) {
this.species = species;
}
}
抽象クラスの特徴:
- 抽象クラスは直接インスタンス化できず、サブクラスを通じて利用
- 抽象クラス内に通常のメソッドを定義可能
- 抽象メソッドは必ず抽象クラス内に定義
- 抽象クラスにもコンストラクタが存在し、情報の初期化に使用
- 抽象化の意義は開発効率の向上
インターフェース
//インターフェース:メソッドの実装を持たず、実装クラスが必要
public interface DataService {
//インターフェース内の定義はすべて抽象的 public abstract
public static final String VERSION = "1.0";
public abstract void save();
void load(String id);
}
//インターフェースを使用した多重継承の実現
public class DataServiceImpl implements DataService, LogService {
@Override
public void save() {
System.out.println("データを保存");
}
@Override
public void load(String id) {
System.out.println(id + "のデータを読み込み");
}
@Override
public void writeLog() {
System.out.println("ログを記録");
}
}
実装クラスはインターフェース内の全メソッドをオーバーライドする必要があります。
インターフェースの利点:
- 制約の定義
- メソッドの仕様を定義し、異なる開発者が実装可能
- implementsを使用して複数のインターフェースを実装可能
例外処理(ExceptionとError)
例外処理にはtry、catch、finally、throw、throwsを使用します。
public class ExceptionDemo {
public static void main(String[] args) {
int x = 10;
int y = 0;
//例外処理の構造
try {
System.out.println(x / y);
} catch (ArithmeticException e) {
System.out.println("算術例外発生");
} catch (Exception e) {
System.out.println("一般例外発生");
} catch (Error e) {
System.out.println("エラー発生");
} catch (Throwable t) {
System.out.println("Throwable発生");
} finally {
System.out.println("finallyブロック実行");
}
//例外キャッチは範囲の小さい順に行う
}
}
//メソッド内で例外を処理できない場合、メソッド宣言で例外をスロー
public void calculate(int x, int y) throws ArithmeticException {
if (y == 0) {
throw new ArithmeticException(); //例外を明示的にスロー、通常はメソッド内で使用
}
System.out.println(x / y);
}