Java パッケージ
オブジェクト指向プログラミング手法において、カプセル化 (英語: Encapsulation) とは、抽象的な機能インターフェースの実装の詳細を部分的にラップして非表示にする方法を指します。
カプセル化は、そのクラスのコードとデータが外部クラスによって定義されたコードによってランダムにアクセスされるのを防ぐ保護バリアと考えることができます。
このクラスのコードとデータへのアクセスは、厳格なインターフェイスを通じて制御する必要があります。
カプセル化の主な機能は、コードを呼び出すプログラム フラグメントを変更せずに、独自の実装コードを変更できることです。
適切にパッケージ化すると、コードの理解と管理が容易になり、コードのセキュリティも強化されます。
例
Java ラッパー クラスの例を見てみましょう。
/* 文件名: EncapTest.java */
public class EncapTest{
private String name;
private String idNum;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public String getIdNum(){
return idNum;
}
public void setAge( int newAge){
age = newAge;
}
public void setName(String newName){
name = newName;
}
public void setIdNum( String newId){
idNum = newId;
}
}
上記の例の public メソッドは、外部クラスがクラスのメンバー変数にアクセスするためのエントリ ポイントです。
通常、これらのメソッドは getter および setter メソッドと呼ばれます。
したがって、クラス内のプライベート メンバー変数にアクセスするクラスは、これらのゲッター メソッドとセッター メソッドを経由します。
次の例は、EncapTest クラスの変数にアクセスする方法を示しています。
/* F文件名 : RunEncap.java */
public class RunEncap{
public static void main(String args[]){
EncapTest encap = new EncapTest();
encap.setName("James");
encap.setAge(20);
encap.setIdNum("12343ms");
System.out.print("Name : " + encap.getName()+
" Age : "+ encap.getAge());
}
}
上記のコードをコンパイルして実行した結果は次のとおりです。
Name : James Age : 20
Java インターフェース
Interface (英語: Interface) は、JAVA プログラミング言語の抽象型であり、抽象メソッドの集合であり、通常、インターフェイスはインターフェイスとして宣言されます。クラスは、インターフェースを継承することにより、インターフェースの抽象メソッドを継承します。
インターフェースはクラスではありません. インターフェースはクラスと同様の方法で記述されますが, 異なる概念です. クラスは、オブジェクトのプロパティとメソッドを記述します。インターフェイスには、クラスが実装するメソッドが含まれています。
インターフェイスを実装するクラスが抽象クラスでない限り、クラスはインターフェイスのすべてのメソッドを定義します。
インターフェイスはインスタンス化できませんが、実装できます。インターフェイスを実装するクラスは、インターフェイスに記述されているすべてのメソッドを実装する必要があります。それ以外の場合は、抽象クラスとして宣言する必要があります。さらに、Java では、インターフェース型を使用して変数を宣言したり、null ポインターにしたり、このインターフェースを実装するオブジェクトにバインドしたりできます。
インターフェイスはクラスに似ています。
- インターフェイスは複数のメソッドを持つことができます。
- インターフェイス ファイルは .java で終わるファイルに保存され、ファイル名にはインターフェイス名が使用されます。
- インターフェイスのバイトコード ファイルは、.class で終わるファイルに保存されます。
- インターフェイスに対応するバイトコード ファイルは、パッケージ名と一致するディレクトリ構造にある必要があります。
インターフェイスとクラスの違い:
- インターフェイスを使用してオブジェクトをインスタンス化することはできません。
- インターフェイスにはコンストラクターがありません。
- インターフェイス内のすべてのメソッドは抽象メソッドでなければなりません。
- インターフェイスには、静的変数と最終変数を除き、メンバー変数を含めることはできません。
- インターフェイスはクラスによって継承されませんが、クラスによって実装されます。
- インターフェイスは多重継承をサポートします。
インターフェイスの宣言
インターフェイスの宣言構文は次のとおりです。
[可见度] interface 接口名称 [extends 其他的类名] {
// 声明变量
// 抽象方法
}
Interface キーワードは、インターフェイスを宣言するために使用されます。以下は、インターフェイス宣言の簡単な例です。
/* 文件名 : NameOfInterface.java */
import java.lang.*;
//引入包
public interface NameOfInterface
{
//任何类型 final, static 字段
//抽象方法
}
インターフェイスには次のプロパティがあります。
- Interfaces are implicitly abstract. インターフェイスを宣言するときは、abstractキーワードを使用する必要はありません。
- インターフェイスの各メソッドも暗黙的に抽象化されており、宣言時に抽象キーワードも必要ありません。
- インターフェイスのメソッドは public です。
例
/* 文件名 : Animal.java */
interface Animal {
public void eat();
public void travel();
}
インターフェースの実装
クラスがインターフェイスを実装する場合、クラスはインターフェイス内のすべてのメソッドを実装する必要があります。それ以外の場合は、クラスを抽象として宣言する必要があります。
クラスは、implements キーワードを使用してインターフェイスを実装します。クラス宣言では、Implements キーワードはクラス宣言の後に配置されます。
インターフェイスの構文を実装するには、次の式を使用できます。
... implements 接口名称[, 其他接口, 其他接口..., ...] ...
例
/* 文件名 : MammalInt.java */
public class MammalInt implements Animal{
public void eat(){
System.out.println("Mammal eats");
}
public void travel(){
System.out.println("Mammal travels");
}
public int noOfLegs(){
return 0;
}
public static void main(String args[]){
MammalInt m = new MammalInt();
m.eat();
m.travel();
}
}
上記の例をコンパイルして実行した結果は次のとおりです。
Mammal eats
Mammal travels
インターフェイスで宣言されたメソッドをオーバーライドするときは、次の規則に従う必要があります。
- クラスがインターフェイス メソッドを実装する場合、必須例外をスローすることはできません. インターフェイスまたはインターフェイスを継承する抽象クラスでのみ必須例外をスローできます.
- クラスは、メソッドをオーバーライドするときに一貫したメソッド名を維持する必要があり、同じまたは互換性のある戻り値の型を維持する必要があります。
- インターフェイスを実装するクラスが抽象クラスの場合、そのインターフェイスのメソッドを実装する必要はありません。
インターフェースを実装する際には、注意すべきルールもいくつかあります。
- クラスは同時に複数のインターフェイスを実装できます。
- クラスは 1 つのクラスからしか継承できませんが、複数のインターフェイスを実装できます。
- インターフェイスは、クラス間の継承と同様に、別のインターフェイスを継承できます。
インターフェイスの継承
インターフェイスは別のインターフェイスを継承できます。これは、クラス間の継承方法に似ています。インターフェースの継承は extends キーワードを使用し、サブインターフェースは親インターフェースのメソッドを継承します。
次の Sports インターフェイスは、Hockey および Football インターフェイスによって継承されます。
// 文件名: Sports.java
public interface Sports
{
public void setHomeTeam(String name);
public void setVisitingTeam(String name);
}
// 文件名: Football.java
public interface Football extends Sports
{
public void homeTeamScored(int points);
public void visitingTeamScored(int points);
public void endOfQuarter(int quarter);
}
// 文件名: Hockey.java
public interface Hockey extends Sports
{
public void homeGoalScored();
public void visitingGoalScored();
public void endOfPeriod(int period);
public void overtimePeriod(int ot);
}
Hockey インターフェースは 4 つのメソッドを宣言し、Sports インターフェースから 2 つのメソッドを継承します. このように、Hockey インターフェースを実装するクラスは 6 つのメソッドを実装する必要があります.
同様に、Football インターフェースを実装するクラスは 5 つのメソッドを実装する必要があり、そのうちの 2 つは Sports インターフェースからのものです。
インターフェイス多重継承
Java では、クラスの多重継承は禁止されていますが、インターフェイスでは多重継承が許可されています。
extends キーワードは、インターフェイスの多重継承で 1 回だけ使用する必要があり、その後に継承されたインターフェイスが続きます。次のように:
public interface Hockey extends Sports, Event
上記のプログラム フラグメントは、法的に定義されたサブインターフェイスです。クラスとは異なり、インターフェイスは複数の継承を許可し、Sports と Event は同じメソッドを定義または継承できます。
マーカー インターフェイス
最も一般的な継承されたインターフェイスは、メソッドを含まないものです。
ID インターフェイスは、メソッドやプロパティを持たないインターフェイスであり、そのクラスが特定の型に属していることを示すだけであり、他のコードがテストして何かを実行できるようにします。
識別インターフェースの役割: 簡単に言えば、オブジェクトにマーク (スタンプ) を付けて、オブジェクトが特定の権限を持つようにすることです。
例: java.awt.event パッケージの MouseListener インターフェイスから継承された java.util.EventListener インターフェイスは、次のように定義されます。
package java.util;
public interface EventListener
{}
メソッドのないインターフェイスは、マーカー インターフェイスと呼ばれます。マーカー インターフェイスは、主に次の 2 つの目的で使用されます。
- パブリックの親インターフェイスを作成します。
他の多数のインターフェースによって拡張された Java API である EventListener インターフェースと同様に、マーカー インターフェースを使用して、一連のインターフェースの親インターフェースを作成できます。たとえば、インターフェースが EventListener インターフェースを継承する場合、Java 仮想マシン (JVM) は、そのインターフェースがイベント プロキシ ソリューションに使用されることを認識します。
- クラスにデータ型を追加します。
この状況は、マーカー インターフェースの本来の目的です。マーカー インターフェースを実装するクラスは、インターフェース メソッドを定義する必要はありませんが (マーカー インターフェースにはメソッドがまったくないため)、クラスはポリモーフィズムによってインターフェース型になります。