English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Java フローコントロール

Java 配列

Java オブジェクト指向(I)

Java オブジェクト指向(II)

Java オブジェクト指向(III)

Java 例外処理

Java リスト(List)

Java Queue(キュー)

Java Map集合

Java Set集合

Java 入出力(I/O)

Java Reader/Writer

Java 他のトピック

Java 封装

このチュートリアルでは、サンプルを通じてJavaのエンキャッピングとデータの隠蔽を学びます。

Java 封装

エンキャッピングは、オブジェクト指向プログラミングの重要な機能の1つです。エンキャッピングとは、フィールドやメソッドを単一のクラスにバインドすることです。

クラス内の似たフィールドやメソッドをバンドルすることで、データの隠蔽にも役立ちます。

エンキャッピングフィールドとメソッド

通常、エンキャッピングとは、似たコードを一箇所にまとめるプロセスです。

Javaでは、単一のクラス内で一括で操作するフィールドやメソッドをバンドルすることができます。例えば、

class Rectangle {
   int length;
   int breadth;
   public void getArea() {}
}

上記のプログラムでは、getArea()メソッドが四角形の面積を計算します。面積を計算するために、長さ(length)と幅(breadth)が必要です。したがって、データフィールドlength、breadthとメソッドgetArea()がRectangleクラスに配置されています。

Java データの隠蔽

データの隠蔽とは、実装の詳細を隠してデータメンバのアクセスを制限する方法です。

エンキャッピングは、データを隠す方法を提供します。

データの隠蔽はアクセス修飾子を通じて実現できます。Javaでは、4つのアクセス修飾子があります:

  • public - 修飾された属性やメソッドはパブリックであり、どこからでもアクセスできます。デフォルトでは、すべての属性とメソッドはpublicです

  • private - 修飾された属性やメソッドはプライベートであり、それを宣言したクラスの外部からアクセスすることはできません

  • protected - 修飾された属性やメソッドはprotectedであり、privateと同様に、サブクラスからもアクセスできますが、違いは子クラスでもアクセス可能であることです

  • default - アクセス修飾子が付いていない場合、通常「デフォルトアクセスモード」と呼ばれます。このモードでは、同じパッケージ内でのみアクセスが許可されます。

詳細については、以下のURLにアクセスしてくださいJava メタデータ

例1:private データ隠蔽

class Person {
   private int age;
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
}
class Main {
   public static void main(String[] args) {
      Person p1 = new Person();
      p1.setAge(24);
      System.out.println("私の年齢は " + p1.getAge());
   }
}

出力結果

私の年齢は 24

上記の例では、私有的なフィールドageがあります。プライベートであるため、外部からアクセスすることはできません。ageにアクセスするために、publicメソッドgetAge()とsetAge()を使用します。これらのメソッドはgetterとsetterメソッドと呼ばれます。

Mainクラスからageフィールドにアクセスを試みると、エラーメッセージが表示されます。

p1.age = 24;     // error: age has private access in Person

ageをプライベートに設定することで、クラス外部からの認証なしでのアクセスを制限できます。これはデータ隠蔽です。

例2:protected データ隠蔽

class Person {
 protected String profession;
 protected void displayInfo() {
   System.out.println("I am a " + profession);
 }
}
class Teacher extends Person {
   public static void main(String[] args) {
      Teacher t1 = new Teacher();
      t1.profession = "teacher";
      t1.displayInfo();
   }
}

出力結果

I am a teacher

上記のプログラムでは、protectedフィールド profession と protectedメソッドdisplayInfo()を持つPersonクラスを定義しました。

これらのメンバーはTeacherクラス(Personのサブクラス)からアクセスしています。

なぜ封装が必要なのですか?

  • Javaでは、封装は関連するフィールドやメソッドを一緒に保つことができ、コードをきれいにして読みやすくします。

  • これにより、データフィールドの変更を制御するのに役立ちます。例えば、クラス内のageフィールドが非負数であることを望む場合、ageをプライベートに設定し、setAge()メソッド内でロジックを適用することができます。例えば、

class Person {
   private int age;
   public void setAge(int age) {
     if (age >= 0) {
        this.age = age;
     }
   }
}
  • getterとsetterメソッドは、クラスのフィールドに対する読み取り専用または書き込み専用アクセスを提供します。例えば、

getName()   // 読み取り専用アクセスを提供
setName()   //読み込み専用アクセスを提供
  • これにより、システムのコンポーネントを解耦するのに役立ちます。これらの解耦されたコンポーネントは、独立して同時に開発、テスト、デバッグができます。また、特定のコンポーネントの変更は、他のコンポーネントに影響を与えません。

データの隠蔽とエンキャップメント

人々は通常、エンキャップメントがデータの隠蔽であると考えていますが、これは完全に正しくありません。

エンキャップメントとは、関連するフィールドとメソッドを束ねることを意味します。これにより、データの隠蔽を実現することができます。エンキャップメント自体はデータの隠蔽ではない。