【Java入門】各用語を簡単に解説（コンストラクタ,継承,インターフェース,static,例外の説明)

## はじめに

　javaの基本用語である『コンストラクタ,継承,インターフェース,static,例外』について目的・特徴・書き方に分けて簡単に説明します。javaの研修や後輩に教えるときなど簡潔に説明しなくてはいけないと時にお使いください。

## コンストラクタ
　クラスからオブジェクトを作成する際に呼び出される特殊なメソッドです。

#### ・目的
**1\. オブジェクトの初期化**

　クラスのインスタンス（オブジェクト）を作成する際に、そのオブジェクトの初期化を行います。
　コンストラクタは、オブジェクトがどのように初期化されるかを定義します。

**2\. メンバ変数の設定**

　コンストラクタを使用して、オブジェクトのメンバ変数（インスタンス変数）に初期値を設定できます。

#### ・特徴
* コンストラクタの名前はクラスの名前と同じであり、戻り値型を指定しません。コンストラクタは戻り値を持たないため、voidも指定しません。

* 複数のコンストラクタを定義できます。これをオーバーロードと呼びます。異なる引数リストを持つ複数のコンストラクタを定義することで、オブジェクトを異なる方法で初期化できます。

#### ・書き方

```java:コンストラクタ
public class MyClass {
	
	private int num;
	private String str;

    // コンストラクタ
	public MyClass() {
		num = 0;
		str = "Hello World!";
	}

    // オーバーロードされたコンストラクタ
	public MyClass(int a, String b) {
		num = a;
		str = b;
	}
}
```

```java:Main.java
MyClass ob1 = new MyClass();
MyClass ob2 = new MyClass(1,"hoge");
```

## 継承
　既存のクラス（親クラス）の特性や振る舞いを新しいクラス（子クラス）に引き継ぐ機能を提供します。

#### ・目的
**1\. スーパークラスとサブクラス**

　 継承の基本は、1つのスーパークラスから複数のサブクラスを派生させることです。スーパークラスは既存のクラスであり、サブクラスはスーパークラスから特性やメソッドを継承します。

**2\. 差分プログラミング**

　共通させるものは継承してスーパークラスの機能を使い、サブクラスではスーパークラスにはない機能の差分を作ることで開発時間を短縮します。

#### ・特徴

* サブクラスはextendsキーワードを使用してスーパークラスを指定します。

* サブクラスはスーパークラスのフィールド（メンバ変数）とメソッドを継承します。
※`private`アクセス修飾子は継承されません。

*  サブクラスはスーパークラスのメソッドを再定義できます。これは**オーバーライド**と呼びます。

* サブクラスでスーパークラスのメソッドをオーバーライドした場合、`super`キーワードを使用してスーパークラスのメソッドを呼び出すことができます。

#### ・書き方

```java:継承
public class Animal {
	
	void eat() {
		System.out.println("餌を食べます。");
	}
	
	void sound() {
		System.out.println("動物の鳴き声");
	}
	
}

class Dog extends Animal{

    // Animalクラスのsound()メソッドをオーバライド
	void sound() {
		System.out.println("ワン！");
	}
}

class Cat extends Animal{

    // Animalクラスのsound()メソッドをオーバライド
	void sound() {
		System.out.println("ニャ～");
	}
}
```

```java:Main.java
// Dogクラスのインスタンスを作成
Animal dog = new Dog();
dog.sound();
dog.eat();
		
// Catクラスのインスタンスを作成
Animal cat = new Cat();
cat.sound();
dog.eat();
```

```:実行結果
ワン！
餌を食べます。
ニャ～
餌を食べます。
```

## インターフェース
　抽象化を提供し、クラスとクラスの間で共通の契約を定義するための重要な概念です。
　インターフェースのメソッドはシグネチャだけを含み、具体的な実装を持ちません。このインターフェースを使うクラスが実装を行います。

#### ・目的
**1\. クラス間の関係性を定義する**

　 複数のクラスが共通のメソッドや振る舞いを提供することができ、これによりクラスがどのような機能があるかを明示的に定義できます。

**2\. ポリモーフィズムの実現**

　異なるクラスが同じインターフェースを実装することができます。これにより、異なるクラスのインスタンスを統一的に扱うことができ、ポリモーフィズムを実現できます。

**3\. コードの再利用と実装漏れを防ぐ**

　新しいクラスが既存のインターフェースを実装することで、既存のコードを再利用できます。またインターフェースで定義したメソッドは必ず実装しなくてはならないため、書き方を制限することができます。

#### ・特徴

* インターフェースは`interface`キーワードを使用して定義されます。メソッドのシグネチャだけが含まれ、メソッドの本体はありません。

* クラスは`implements`キーワードを使用してインターフェースを実装できます。実装されたインターフェースのメソッドは、クラス内で具体的な実装を提供する必要があります。

*  クラスの継承は１つしかできませんが、複数のインターフェースを実装することができます。

#### ・書き方

```java:インターフェース
public interface Interface {
	
	// メソッドのシグネチャのみ
	void method();
	
}
```

```java:実装クラス
public class MyClass implements Interface {

	public void method() {
		System.out.println("実装しました！");
	}

}
```


## static
クラスのインスタンスを生成せずにクラス自体からアクセスできる特性を持ちます。
static は「静的」を意味します。「動的ではない」ということで、そのフィールドはいくらインスタンスをたくさん生成したとしても、クラスにたった１つです。


#### ・目的
**1\. 共有情報**

　 インスタンスを複数作ってもクラスで共有され続けるので、共有資源として使いたい場合に使えます。

**2\. static領域とヒープ領域**

　staticで就職された変数・メソッドは、インスタンス生成前にstatic領域に配置され、インスタンス変数・メソッドはヒープ領域に配置されます。ヒープ領域ではnewされる度にクラス定義にしたがってインスタンスが生成されるため、値が同じでも参照先が異なるようになります。

#### ・特徴

* `static`キーワードを使用して宣言された変数は、クラス変数または静的変数と呼ばれます。これらの変数は、クラス自体に関連付けられ、クラスのすべてのインスタンスで共有されます。クラス変数は、「**クラス名.変数名**」の形式でアクセスされます。

* `static` キーワードを使用して宣言されたメソッドは、クラスメソッドと呼ばれます。クラスメソッドはクラス自体に関連付けられ、インスタンスを作成せずに呼び出すことができます。クラスメソッドは、「**クラス名.メソッド名()**」の形式で呼び出されます。

*  クラスが初期化されるときに一度だけ実行される **static 初期化ブロック**を使用できます。このブロックは主にクラス変数の初期化や複雑な初期化ロジックを含めるために使用されます。

#### ・書き方

```java:static
public class MyClass {
	
	// クラス変数
	static int count = 0;
	
	// クラスメソッド
	public static void method() {
		
	}
	
	// static初期化ブロック
	static {
        
    }
}
```

## 例外
プログラムの実行中に発生するエラーや問題に対処するための仕組みです。また例外クラスは例外処理をしてくれるのではなく、例外を報告するレポートです。そのレポートを呼び出し元がキャッチして、例外処理という復帰作業を行います。

#### ・目的
**1\. 復帰作業**

　 プログラムの実行中に発生するエラーや問題に対処するための仕組み

#### ・特徴

* 例外は**チェック例外**と**非チェック例外**があります。チェック例外はコンパイル時に検出され、非チェック例外は実行時に発生され、エラーを示します。

* 例外はプログラム内で異常な状況が発生したときに自動的にスロー（throw）されます。

*  例外の処理は、**try-catchブロック**で例外をキャッチして処理する方法と**throws宣言**で特定の例外をスローする方法があります。

*  例外はメソッドからメソッドへ伝搬し、適切な例外処理が行われるまで上位の呼び出し元に渡ります（**例外の伝搬**）。

#### ・書き方

```java:try-catchブロック
try {
    // 例外が発生する可能性のあるコード
} catch (ExceptionType e) {
    // 例外を処理するコード
}
```

```java:throws宣言
public void myMethod() throws SomeException {
    // 例外をスローする可能性のあるコード
}
```