これまでの内容を要約すると、オブジェクトは特定のものを指し、クラスはオブジェクトの種類を指します。オブジェクトには状態とアクション、つまりデータ メンバーとメソッドを持つことができます。
これまで、データ メンバーとメソッドは内部ユーザーと外部ユーザーの両方に公開されていました。オブジェクト内では、これを使用してオブジェクトのデータ メンバーとメソッドを呼び出します。オブジェクトの外部では、たとえば別のクラスのオブジェクトを呼び出すとき、object.data メンバーと object.method() を使用してオブジェクトのデータ メンバーとメソッドを呼び出すことができます。
オブジェクトのメンバー (メンバーにはデータ メンバーとメソッドが含まれます) をカプセル化して、一部のメンバーのみを外部から呼び出せるようにします。カプセル化を使用すると、オブジェクトの使いやすさとセキュリティを向上させることができます。
カプセル化とインターフェース
カプセル化はコンピュータの一般的な用語で、限られた外部インターフェイスを保持し、特定の実装の詳細を隠すことを意味します。たとえば、Linux アーキテクチャでは、Linux オペレーティング システムが基盤となるハードウェアの特定の詳細をカプセル化し、システム コール インターフェイスのみを保持していることがわかります。ユーザーはパッケージの外部にいるため、インターフェイスを通じて必要な操作のみを実行できます。
カプセル化は生活の中で非常に一般的です。たとえば、これは充電式懐中電灯です。
マニュアルを読まなくても、ユーザーはこの懐中電灯の操作、つまりスイッチと充電を推測できます。この懐中電灯はプラスチックのシェルを使用して、ユーザーが触れる必要のない内部の詳細を隠し、スイッチと電気プラグの 2 つのインターフェイスだけを残します。ユーザーは、これら 2 つのインターフェイスを使用して、製品が実現するように設計された機能を十分に使用できます。すべての詳細が同時にユーザーに公開されると、ユーザーは製品に圧倒されてしまうでしょう (以下の殻を外したリモコンなど)。したがって、カプセル化により製品の使いやすさが向上します。
製品が梱包されていない場合、バッテリー、回路、密閉されたゴムなど、懐中電灯やリモコンの多くの詳細がユーザーにさらされることになります。これにより、バッテリーを直接放電したり、LEDライトを取り出したりするなど、より自由な操作が可能になります。ただし、多くの場合、ユーザーは製品を損傷する大きなリスクを負います。したがって、カプセル化により製品の安全性が向上します。
Java ソフトウェア製品は日常的な製品と同じです。オブジェクトには、その中に多くのメンバー (データ メンバーとメソッド) を含めることができます。一部のデータ メンバーとメソッドは内部でのみ使用されます。現時点では、オブジェクトをカプセル化するためにオブジェクトを「パック」するメカニズムが必要になります。このようにして、ユーザーは内部メンバーに連絡することなく、外部インターフェイスをより簡単に学習して使用できるようになります。
オブジェクトメンバーのカプセル化
Java は、オブジェクトのメンバーの外部可視性を制御するために、public、private、protected という 3 つのキーワードを使用します。
1.public: メンバーは外部から見えます。つまり、メンバーはインターフェースの一部です。
2.private: このメンバーは外部からは見えず、内部でのみ使用でき、外部からアクセスすることはできません。
(保護には継承の概念が含まれますが、これについては後で説明します)
まず、以前に定義した Human クラスをカプセル化しましょう。
次のようにコードをコピーします。
パブリッククラステスト
{
public static void main(String[] args)
{
人間 aperson = 新しい人間(160);
System.out.println(aperson.getHeight());
aperson.growHeight(170);
System.out.println(aperson.getHeight());
aパーソン.repeatBreath(100);
}
}
クラス人間
{
/**
* コンストラクター
*/
public Human(int h)
{
this.height = h;
System.out.println("私は生まれました");
}
/**
*アクセサ
*/
public int getHeight()
{
this.height を返します。
}
/**
* ミューテーター
*/
public void 成長高さ(int h)
{
この高さ = この高さ + h;
}
/**
* カプセル化、内部使用用
*/
プライベートボイドブレス()
{
System.out.println("ふ…ふ…");
}
/**
* Breath() を呼び出す
*/
public voidrepeatBreath(int rep)
{
int i;
for(i = 0; i < rep; i++) {
this.breath();
}
}
private int height; // 内部使用のためにカプセル化されます。
}
内部メソッドはカプセル化の影響を受けません。人間の内部メソッドは、プライベートに設定された height や Breath() も含めて、任意のメンバーを呼び出すことができます。
外部メソッドはパブリック メンバーのみを呼び出すことができます。 Test など、Human の外部にいる場合、Human でパブリックとして指定されたメンバーのみを呼び出すことができますが、プライベートとして指定されたメンバーは呼び出すことができません。
カプセル化により、Human クラスは次のメソッドのみをインターフェイスとして保持します。
1.getHeight()
2.growHeight()
3.repBreath()
Human クラスとそのインターフェイスは次のように表すことができます。
「ケース付きリモコン」
メインからの呼び出しの高さを強制すると、次のようになります。
次のようにコードをコピーします。
System.out.println(aperson.height);
次のエラー メッセージが表示されます。
次のようにコードをコピーします。
Test.java:6: 高さには Human でプライベート アクセスがあります
System.out.println(aperson.height);
^
1 エラー
ピーッ、感電したよ! private として宣言されたメンバーを外部から呼び出すことはできません。
Javaの通常の仕様では、状態(高さなど)を表すデータメンバはprivateに設定されます。データ メンバーの変更は、インターフェイスによって提供されるメソッド (getHeight() や giveHeight() など) を通じて実行する必要があります。この仕様はデータを保護する役割を果たします。ユーザーはデータを直接変更することはできず、対応するメソッドを使用してデータを読み書きする必要があります。クラス設計者は、インターフェイス メソッドにデータ使用仕様を追加できます。
クラスのカプセル化
.java ファイルには、上記の Test クラスなど、public キーワードを持つクラスが 1 つだけ存在します。したがって、他のクラスからこのクラスを直接呼び出すことができます。人間クラスにはキーワードはありません。以前は、オブジェクトのメンバーにはキーワードがありませんでした。このキーワードの欠如は、一種の可視性も表します。これについては、パッケージを説明するときに詳しく説明します。
懐中電灯を表すために、Torch クラスをカプセル化する練習をします。インターフェイスにはスイッチングと充電があります。内部メンバーが権力を持っている。
要約する
カプセル化、インターフェース
プライベート、パブリック