Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのクラスの種類一覧!具象・抽象・final・POJO・静的・内部クラスを徹底解説

Javaには、用途や宣言方法に応じてさまざまな種類のクラスが存在します。それぞれのクラスには固有の役割があり、適切に使い分けることで、保守性の高いコードを書くことができます。この記事では、Javaの代表的な6つのクラスの種類について、コード例とともにわかりやすく解説します。

1. 具象クラス(Concrete Class)

具象クラスとは、抽象メソッドを持たない通常のクラス、または親クラスやインターフェースのすべてのメソッドを実装しているクラスのことです。直接インスタンス化できる、最も一般的なクラスです。

コード例

public class Concrete { // 具象クラス
    static int product(int a, int b) {
        return a * b;
    }
    public static void main(String args[]) {
        int p = product(2, 3);
        System.out.println("Product: " + p);
    }
}

実行結果

Product: 6

2. 抽象クラス(Abstract Class)

abstractキーワードを使って宣言され、0個以上の抽象メソッドを持つクラスを抽象クラスと呼びます。抽象クラスは未完成のクラスであるため、そのままインスタンス化することはできません。使用する際は、必ず具象クラスに継承(extends)して、抽象メソッドを実装する必要があります。

コード例

abstract class Animal { // 抽象親クラス
    public abstract void sound(); // 抽象メソッド
}
public class Dog extends Animal { // DogクラスがAnimalクラスを継承
    public void sound() {
        System.out.println("Woof");
    }
    public static void main(String args[]) {
        Animal a = new Dog();
        a.sound();
    }
}

実行結果

Woof

3. finalクラス

finalキーワードで宣言されたクラスはfinalクラスと呼ばれ、他のクラスによる継承が禁止されます。たとえば、標準ライブラリのjava.lang.Systemクラスなどがこれに該当します。セキュリティや不変性を確保したい場合に活用されます。

コード例

final class BaseClass {
    void Display() {
        System.out.print("This is Display() method of BaseClass.");
    }
}
class DerivedClass extends BaseClass { // コンパイルエラー:finalクラスは継承不可
    void Display() {
        System.out.print("This is Display() method of DerivedClass.");
    }
}
public class FinalClassDemo {
    public static void main(String[] arg) {
        DerivedClass d = new DerivedClass();
        d.Display();
    }
}

上記の例では、DerivedClass が BaseClass(final)を継承しようとしています。finalクラスは継承できないため、コンパイラがエラーを出力します。したがって、このプログラムは実行できません

コンパイルエラーの出力例

cannot inherit from final BaseClass
Compile-time error - can't inherit final class

4. POJOクラス

POJO(Plain Old Java Object:プレーン・オールド・ジャバ・オブジェクト)クラスとは、プライベートなフィールド変数と、それにアクセスするためのsetter/getterメソッドのみを持つクラスのことです。完全にカプセル化されたクラスであり、データを保持するためのシンプルな構造として広く利用されています。

コード例

class POJO {
    private int value = 100;
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
}
public class Test {
    public static void main(String args[]) {
        POJO p = new POJO();
        System.out.println(p.getValue());
    }
}

実行結果

100

5. 静的クラス(Static Nested Class)

静的クラスとは、別のクラスの中でstaticメンバーとして宣言されたネストされたクラス(入れ子クラス)のことです。外部クラスのインスタンスを作成しなくても、独立してインスタンス化できるのが大きな特徴です。

コード例

import java.util.Scanner;
class staticclasses {
    static int s; // 静的変数
    static void met(int a, int b) { // 静的メソッド
        System.out.println("static method to calculate sum");
        s = a + b;
        System.out.println(a + "+" + b); // 2つの数値を出力
    }
    static class MyNestedClass { // 静的クラス
        static { // 静的ブロック
            System.out.println("static block inside a static class");
        }
        public void disp() {
            int c, d;
            Scanner sc = new Scanner(System.in);
            System.out.println("Enter two values");
            c = sc.nextInt();
            d = sc.nextInt();
            met(c, d); // 静的メソッドを呼び出す
            System.out.println("Sum of two numbers-" + s); // 静的変数の結果を出力
        }
    }
}
public class Test {
    public static void main(String args[]) {
        staticclasses.MyNestedClass mnc = new staticclasses.MyNestedClass(); // 静的クラスのオブジェクト生成
        mnc.disp(); // 静的クラス内のメソッドへアクセス
    }
}

実行結果

static block inside a static class
Enter two values 10 20
static method to calculate sum
10+20
Sum of two numbers-30

6. 内部クラス(Inner Class)

内部クラスとは、別のクラスやメソッドの中で宣言されたクラスのことです。外部クラスのメンバーにアクセスできるため、密接に関連する処理をひとつにまとめたい場合に便利です。

コード例

public class OuterClass {
    public static void main(String[] args) {
        System.out.println("Outer");
    }
    class InnerClass {
        public void inner_print() {
            System.out.println("Inner");
        }
    }
}

実行結果

Outer

まとめ

Javaのクラスは、目的に応じて「具象クラス」「抽象クラス」「finalクラス」「POJOクラス」「静的クラス」「内部クラス」など、さまざまな形で定義できます。それぞれの特徴を正しく理解し、状況に応じて適切なクラスを選択することが、読みやすく堅牢なJavaプログラムを書くための第一歩となります。

  1. Java 9 JShellの起動スクリプト(DEFAULT・JAVASE・PRINTING)の違いと使い方

    JShellは、Java 9で導入された対話型のJavaシェルツールです。コマンドラインプロンプトから起動でき、入力したコードをその場で評価して結果を即座に表示します。いわゆるREPL(Read-Evaluate-Print-Loop:読み込み→評価→表示→繰り返し)ツールとして動作するため、コード断片の動作確認やAPIの学習に非常に便利です。 起動スクリプトの指定方法(--startupフラグ) JShellでは、起動時にスクリプトを読み込むことで、あらかじめ定義済みのimport文や便利なメソッドを使える状態でセッションを開始できます。起動スクリプトを指定するには「--startup」フ

  2. Java 9のJShellで使える「/edit」コマンドの種類と使い方

    JShellは、Java 9で導入されたコマンドラインツールです。main()メソッドを用意しなくても、宣言・ステートメント・式をその場で評価できるのが大きな特徴です。さらに、JShellにはJShell Edit Padという簡易テキストエディタが組み込まれており、「/edit」コマンドで起動することで、入力済みのコードを手軽に編集できます。 /editコマンドの3つの形式 JShellで利用できる「/edit」コマンドには、次の3つの形式があります。 /edit /edit [ID] /edit [コード名] /edit:引数なしで実行すると、現在アクティブなすべてのコードがテキストエデ