ポリモーフィズムとカプセル化

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

カプセル化とは、オブジェクトに関連する操作とデータをまとめて包むバッグのようなものです。ポリモーフィズムとは、オブジェクトが多くの形態をとることができる能力です。この実験では、それらがどのようなものか見ていきましょう。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java/ObjectOrientedandAdvancedConceptsGroup -.-> java/class_attributes("Class Attributes") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/class_methods("Class Methods") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/inheritance("Inheritance") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/polymorphism("Polymorphism") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/encapsulation("Encapsulation") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/interface("Interface") subgraph Lab Skills java/class_attributes -.-> lab-178551{{"ポリモーフィズムとカプセル化"}} java/class_methods -.-> lab-178551{{"ポリモーフィズムとカプセル化"}} java/inheritance -.-> lab-178551{{"ポリモーフィズムとカプセル化"}} java/polymorphism -.-> lab-178551{{"ポリモーフィズムとカプセル化"}} java/encapsulation -.-> lab-178551{{"ポリモーフィズムとカプセル化"}} java/interface -.-> lab-178551{{"ポリモーフィズムとカプセル化"}} end

ポリモーフィズム

ポリモーフィズムは、OOPの機能の1つで、異なる方法で単一のアクションを実行できるようにします。コンパイル時に解決される「ポリモーフィズム」は「静的ポリモーフィズム」または「コンパイル時ポリモーフィズム」(オーバーロードがこのタイプ)です。実行時に解決されるポリモーフィズムは「実行時ポリモーフィズム」と呼ばれます(オーバーライドがこのタイプ)。ポリモーフィズムはまた、オブジェクトが多くの形態をとることができる機能を提供します。OOPにおけるポリモーフィズムの非常に一般的な使い方は、親クラスの参照を使って子クラスのオブジェクトを参照する場合です。複数のIS-Aテストを通過できる任意のJavaオブジェクトは、「ポリモーフィック」と見なされます。参照変数は、宣言された型のオブジェクトまたは宣言された型の任意のサブタイプのオブジェクトを参照できます。参照変数は、「クラス型」または「インターフェイス型」として宣言できます。継承の場合も、ポリモーフィズムの1つの形態です。なぜなら、さまざまな種類の動物の行動や特徴があるからです。しかし、ここではポリモーフィズムの別の形態を紹介します。

ポリモーフィズムのクラス図

/home/labex/project/polymorphismTest.javaファイルに次のコードを記述します。

// インターフェイスlifeを宣言します。いくつかのメソッドがありますが、ここでは省略します。
interface life{}
// ポリモーフィズムを実現するクラスを宣言します。内部の内容は、この場合には無視します。
class Animal{}
// Animalクラスとlifeインターフェイスを使うHumanクラスを宣言します。
class Human extends Animal implements life{}

public class polymorphismTest{
    public static void main(String[] args){
        Human human = new Human();  // Humanオブジェクトをインスタンス化する
        // HumanはAnimal、Objectと直接または間接的な継承関係があります。
        // Humanはlifeインターフェイスを実装しているので、instanceof式はtrueを返します。
        System.out.println("humanはHumanのインスタンスですか? " + (human instanceof Human));
        System.out.println("humanはAnimalのインスタンスですか? " + (human instanceof Animal));
        System.out.println("humanはlifeのインスタンスですか? " + (human instanceof life));
        System.out.println("humanはObjectのインスタンスですか? " + (human instanceof Object));
    }
}

出力

次のコマンドを使ってpolymorphismTest.javaファイルを実行します。

javac /home/labex/project/polymorphismTest.java
java polymorphismTest

出力を見てください。

humanはHumanのインスタンスですか? true
humanはAnimalのインスタンスですか? true
humanはlifeのインスタンスですか? true
humanはObjectのインスタンスですか? true

カプセル化

カプセル化は、プログラムの詳細を隠す概念です。他の呼び出し元は、プログラムがどのように機能するかを知ることなく、何を提供できるかだけを知る必要があります。カプセル化により、開発が簡略化されます。これは、データ(変数)とアルゴリズム(メソッドコード)をまとめるメカニズムです。カプセル化では、クラスの変数は他のクラスから隠され、クラスのメソッドを通じてのみアクセスできます。したがって、これは「データ隠蔽」とも呼ばれます。一般的に、クラスフィールドはprivateに宣言され、getter/setterメソッドを使ってデータにアクセスし制御します。publicメソッドを定義するのは、他のクラスに機能を提供するため、または外部での使用のためだけです。時々、クラス内で特定の使用目的のためにのみ使用されるprivateメソッドも定義します。これが、詳細を隠す方法です。

/home/labex/project/encapsulationTest.javaファイルに次のコードを記述します。

class Person{
    /*
     * Personには2つのメンバ変数があります。
     * それらはprivateなので、このクラスの外から直接アクセスできません。
    */
    private String name;
    private int age;
    // 空のコンストラクタ
    public Person(){

    }
    // 2つのパラメータを持つコンストラクタ
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    // このメソッドを使ってnameの値を取得します。
    public String getName(){
        return this.name;
    }
    // このメソッドを使ってnameの値を設定します。
    public void setName(String name){
        this.name = name;
    }
    // このメソッドを使ってageの値を取得します。
    public int getAge(){
        return this.age;
    }
    // このメソッドを使ってageの値を設定します。
    public void setAge(int age){
        this.age = age;
    }
}
public class encapsulationTest{
    public static void main(String[] args){
        Person p = new Person();
        // setXXX()メソッドを使って人の名前と年齢を設定します。
        p.setName("Mike");
        p.setAge(20);
        // getXXX()メソッドを使って人の名前と年齢を取得します。
        System.out.println("Name: " + p.getName() + ", Age: " + p.getAge());
    }
}

出力

次のコマンドを使ってencapsulationTest.javaファイルを実行します。

javac /home/labex/project/encapsulationTest.java
java encapsulationTest

出力を見てください。

Name: Mike, Age: 20

まとめ

カプセル化により、object.XXX を使って直接オブジェクトのデータやプロパティにアクセスする必要はありません。代わりに、getXXX()setXXX() などの形式の標準メソッドを使ってその作業を行います。ジェネリックプログラミングでは、ポリモーフィズムの利点が明らかになりますが、今のところは、ポリモーフィズムがオブジェクトが多くの形態をとることを可能にすることを覚えておくだけです。