インターフェイス
日本語 | 接続口 |
英語 | interface |
ふりがな | いんたーふぇーす、いんたーふぇいす |
フリガナ | インターフェース、インターフェイス |
実装のないクラス。
フィールドを持たず、実装のないメソッドを持つ。interfaceという予約語で宣言する。
メソッドが実装されていないため、インターフェイス単体では何の機能も持たない。implementsという予約語を使用して「継承」のように実装クラスを作り、インターフェイスのメソッドを「オーバーライド」するように実装する。
インターフェイスとその実装クラスは、スーパークラスとサブクラスの関係とほぼ同じ。
ただし、インターフェイスは実装が存在しないため、インタンスを作成できない。そのため、機能的には「直接使用できないスーパークラス」となる。
スーパークラスとサブクラスの関係と同じく、ポリモーフィズムが適用されるため、実装クラスのインスタンスの参照は、インターフェイスの参照型変数に格納できる。
この「インターフェイスの参照型変数」をメソッドの引数として持つ場合、そのインターフェイスの実装クラスのみを渡すことができるようになる。
この機能を利用して、メソッドの中で「特定の処理」を呼び出す側で選択できるようにすることができる。
引数として「特定の処理」を行うメソッドを持つインターフェイスを持たせれば、呼び出す側はそのインターフェイスの実装クラスの内、希望の処理を行う「特定の処理」が実装されている実装クラスを渡せばいい。
つまり、メソッド内の処理の一部を「どのように処理するか」呼び出す側が選択することができる。
これはまるで、Windowsで「エクスプローラーで外付けドライブQにファイルをコピーする」という処理が、USBコネクタに継ながれたドライブが「フロッピードライブ」か「外付けハードディスク」か「USBメモリ」かによって書き込み先が変わるのと似ている。
というより、このような機能そのものが「ポリモーフィズム」であり、インターフェイスはその機能をJavaに持たせたものだからこそ、「インターフェイス」は「インターフェイス」と呼べるのである。
フィールドを持たず、実装のないメソッドを持つ。interfaceという予約語で宣言する。
メソッドが実装されていないため、インターフェイス単体では何の機能も持たない。implementsという予約語を使用して「継承」のように実装クラスを作り、インターフェイスのメソッドを「オーバーライド」するように実装する。
インターフェイスとその実装クラスは、スーパークラスとサブクラスの関係とほぼ同じ。
ただし、インターフェイスは実装が存在しないため、インタンスを作成できない。そのため、機能的には「直接使用できないスーパークラス」となる。
スーパークラスとサブクラスの関係と同じく、ポリモーフィズムが適用されるため、実装クラスのインスタンスの参照は、インターフェイスの参照型変数に格納できる。
この「インターフェイスの参照型変数」をメソッドの引数として持つ場合、そのインターフェイスの実装クラスのみを渡すことができるようになる。
この機能を利用して、メソッドの中で「特定の処理」を呼び出す側で選択できるようにすることができる。
引数として「特定の処理」を行うメソッドを持つインターフェイスを持たせれば、呼び出す側はそのインターフェイスの実装クラスの内、希望の処理を行う「特定の処理」が実装されている実装クラスを渡せばいい。
つまり、メソッド内の処理の一部を「どのように処理するか」呼び出す側が選択することができる。
これはまるで、Windowsで「エクスプローラーで外付けドライブQにファイルをコピーする」という処理が、USBコネクタに継ながれたドライブが「フロッピードライブ」か「外付けハードディスク」か「USBメモリ」かによって書き込み先が変わるのと似ている。
というより、このような機能そのものが「ポリモーフィズム」であり、インターフェイスはその機能をJavaに持たせたものだからこそ、「インターフェイス」は「インターフェイス」と呼べるのである。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// ImplementedClassクラスを使用してみます。
ImplementedClass implementedClass = new ImplementedClass();
implementedClass.output();
// ImplementedClass#output()
// 実装クラスからインターフェイスへのアップキャストは
// 可能です。その際、ポリモーフィズムが適用されるので
// インターフェイスから実装クラスのメソッドを呼び出す
// ことができます。
Interface interfaceOfimplementedClass = implementedClass;
interfaceOfimplementedClass.output();
// ImplementedClass#output()
// インターフェイスには実装がないため、インスタンスを
// 作成できません。
// interfaceOfimplementedClass = new Interface();
// コンパイルエラー:
// Interface のインスタンスを生成することができません。
// インターフェイスはクラスのように実装が存在しないため、
// 純粋にポリモーフィズムのための存在と言えます。
Sample sample = new Sample();
sample.useInterface( implementedClass );
// ImplementedClass#output()
// このとき、もしInterfaceの実装クラスがいっぱいあったら
// そのいっぱいある実装クラスのうちどれを渡すかで
// useInterface()メソッドの結果が変わります。
}
/**
* Interfaceインターフェイスを受け取るメソッド。
* 引数にInterfaceを指定することで、
* 「Interfaceクラスのメソッドを持ち、実装しているクラス」を
* 受け取るように指定できます。
* つまり、Interfaceインターフェイスが一種の「受け口」となり、
* この受け口と合う、つまりInterfaceインターフェイスの
* 実装クラスのみを受け取るようになります。これが
* 「インターフェイス」の由来です。
*/
private void useInterface( Interface interfaces )
{
// 引数としてInterfaceインターフェイスの
// 実装クラスを受け取ります。
interfaces.output();
// この結果は、渡される実装クラスによって異なります。
// 解説内の「特定の処理」がこのInterface#output()メソッドです。
// これにより、useInterface()メソッドを呼び出す側が
// 「Interface#output()メソッドを呼び出した際の結果」を
// 「どの実装クラスを渡すか」で選択できるわけです。
// 逆に言うと、呼び出す側にそういった選択権を
// 持たせたい場合に、このように引数にインターフェイスを
// 渡してもらえばいいわけです。
}
}
/**
* Interfaceインターフェイスを宣言します。
*/
interface Interface
{
/**
* 実装用メソッドを用意します。
*/
public void output();
// 実装はありません。
// もしinterfaceのメソッドに実装があると、
// 以下のようなコンパイルエラーが
// 発生します。
// public void output2(){}
// コンパイルエラー:
// 抽象メソッドは本体を指定しません。
}
/**
* Interfaceインターフェイスの実装クラスImplementedClassを宣言します。
*/
class ImplementedClass implements Interface
{
/**
* インターフェイスのメソッドを実装します。
* 方法はオーバーライドと同じ。
* 同名、同引数、同戻り値のメソッドを作ってください。
*/
public void output()
{
System.out.println( "ImplementedClass#output()" );
}
// インターフェイスを実装する場合には、すべてのメソッドを
// 実装する必要があります。たとえば、output()メソッドを
// 作り忘れると、以下のコンパイルエラーが発生します。
// コンパイルエラー:
// クラスは継承された抽象メソッド Interface.output() をインプリメントする必要があります。
}
public class Sample
{
public static void main( String[] args )
{
// ImplementedClassクラスを使用してみます。
ImplementedClass implementedClass = new ImplementedClass();
implementedClass.output();
// ImplementedClass#output()
// 実装クラスからインターフェイスへのアップキャストは
// 可能です。その際、ポリモーフィズムが適用されるので
// インターフェイスから実装クラスのメソッドを呼び出す
// ことができます。
Interface interfaceOfimplementedClass = implementedClass;
interfaceOfimplementedClass.output();
// ImplementedClass#output()
// インターフェイスには実装がないため、インスタンスを
// 作成できません。
// interfaceOfimplementedClass = new Interface();
// コンパイルエラー:
// Interface のインスタンスを生成することができません。
// インターフェイスはクラスのように実装が存在しないため、
// 純粋にポリモーフィズムのための存在と言えます。
Sample sample = new Sample();
sample.useInterface( implementedClass );
// ImplementedClass#output()
// このとき、もしInterfaceの実装クラスがいっぱいあったら
// そのいっぱいある実装クラスのうちどれを渡すかで
// useInterface()メソッドの結果が変わります。
}
/**
* Interfaceインターフェイスを受け取るメソッド。
* 引数にInterfaceを指定することで、
* 「Interfaceクラスのメソッドを持ち、実装しているクラス」を
* 受け取るように指定できます。
* つまり、Interfaceインターフェイスが一種の「受け口」となり、
* この受け口と合う、つまりInterfaceインターフェイスの
* 実装クラスのみを受け取るようになります。これが
* 「インターフェイス」の由来です。
*/
private void useInterface( Interface interfaces )
{
// 引数としてInterfaceインターフェイスの
// 実装クラスを受け取ります。
interfaces.output();
// この結果は、渡される実装クラスによって異なります。
// 解説内の「特定の処理」がこのInterface#output()メソッドです。
// これにより、useInterface()メソッドを呼び出す側が
// 「Interface#output()メソッドを呼び出した際の結果」を
// 「どの実装クラスを渡すか」で選択できるわけです。
// 逆に言うと、呼び出す側にそういった選択権を
// 持たせたい場合に、このように引数にインターフェイスを
// 渡してもらえばいいわけです。
}
}
/**
* Interfaceインターフェイスを宣言します。
*/
interface Interface
{
/**
* 実装用メソッドを用意します。
*/
public void output();
// 実装はありません。
// もしinterfaceのメソッドに実装があると、
// 以下のようなコンパイルエラーが
// 発生します。
// public void output2(){}
// コンパイルエラー:
// 抽象メソッドは本体を指定しません。
}
/**
* Interfaceインターフェイスの実装クラスImplementedClassを宣言します。
*/
class ImplementedClass implements Interface
{
/**
* インターフェイスのメソッドを実装します。
* 方法はオーバーライドと同じ。
* 同名、同引数、同戻り値のメソッドを作ってください。
*/
public void output()
{
System.out.println( "ImplementedClass#output()" );
}
// インターフェイスを実装する場合には、すべてのメソッドを
// 実装する必要があります。たとえば、output()メソッドを
// 作り忘れると、以下のコンパイルエラーが発生します。
// コンパイルエラー:
// クラスは継承された抽象メソッド Interface.output() をインプリメントする必要があります。
}
// Sample.java public class Sample { public static void main( String[] args ) { // ImplementedClassクラスを使用してみます。 ImplementedClass implementedClass = new ImplementedClass(); implementedClass.output(); // ImplementedClass#output() // 実装クラスからインターフェイスへのアップキャストは // 可能です。その際、ポリモーフィズムが適用されるので // インターフェイスから実装クラスのメソッドを呼び出す // ことができます。 Interface interfaceOfimplementedClass = implementedClass; interfaceOfimplementedClass.output(); // ImplementedClass#output() // インターフェイスには実装がないため、インスタンスを // 作成できません。 // interfaceOfimplementedClass = new Interface(); // コンパイルエラー: // Interface のインスタンスを生成することができません。 // インターフェイスはクラスのように実装が存在しないため、 // 純粋にポリモーフィズムのための存在と言えます。 Sample sample = new Sample(); sample.useInterface( implementedClass ); // ImplementedClass#output() // このとき、もしInterfaceの実装クラスがいっぱいあったら // そのいっぱいある実装クラスのうちどれを渡すかで // useInterface()メソッドの結果が変わります。 } /** * Interfaceインターフェイスを受け取るメソッド。 * 引数にInterfaceを指定することで、 * 「Interfaceクラスのメソッドを持ち、実装しているクラス」を * 受け取るように指定できます。 * つまり、Interfaceインターフェイスが一種の「受け口」となり、 * この受け口と合う、つまりInterfaceインターフェイスの * 実装クラスのみを受け取るようになります。これが * 「インターフェイス」の由来です。 */ private void useInterface( Interface interfaces ) { // 引数としてInterfaceインターフェイスの // 実装クラスを受け取ります。 interfaces.output(); // この結果は、渡される実装クラスによって異なります。 // 解説内の「特定の処理」がこのInterface#output()メソッドです。 // これにより、useInterface()メソッドを呼び出す側が // 「Interface#output()メソッドを呼び出した際の結果」を // 「どの実装クラスを渡すか」で選択できるわけです。 // 逆に言うと、呼び出す側にそういった選択権を // 持たせたい場合に、このように引数にインターフェイスを // 渡してもらえばいいわけです。 } } /** * Interfaceインターフェイスを宣言します。 */ interface Interface { /** * 実装用メソッドを用意します。 */ public void output(); // 実装はありません。 // もしinterfaceのメソッドに実装があると、 // 以下のようなコンパイルエラーが // 発生します。 // public void output2(){} // コンパイルエラー: // 抽象メソッドは本体を指定しません。 } /** * Interfaceインターフェイスの実装クラスImplementedClassを宣言します。 */ class ImplementedClass implements Interface { /** * インターフェイスのメソッドを実装します。 * 方法はオーバーライドと同じ。 * 同名、同引数、同戻り値のメソッドを作ってください。 */ public void output() { System.out.println( "ImplementedClass#output()" ); } // インターフェイスを実装する場合には、すべてのメソッドを // 実装する必要があります。たとえば、output()メソッドを // 作り忘れると、以下のコンパイルエラーが発生します。 // コンパイルエラー: // クラスは継承された抽象メソッド Interface.output() をインプリメントする必要があります。 }
「みだし」に含まれているページ
「解説」に含まれているページ
- <jsp:useBean>
- abstractクラス
- Arrays
- CharSequence
- clone
- Cloneable
- CloneNotSupportedException
- Collection
- Comparable
- Comparator
- compareTo
- Connection
- Cookie
- DELETE
- DOM
- DTD
- Enumeration
- execute
- extends
- HashMap
- HashSet
- Hashtable
- HttpServletRequest
- HttpServletResponse
- HttpSession
- IEEE
- implements
- INSERT
- interface
- Iterator
- java.sql.Date
- JavaBeans
- JSP暗黙オブジェクト「application」
- JSP暗黙オブジェクト「config」
- JSP暗黙オブジェクト「request」
- JSP暗黙オブジェクト「response」
- JSP暗黙オブジェクト「session」
- JTree
- List
- Map
- MVC
- Node
- NoSuchElementException
- ObjectInputStream
- ObjectOutputStream
- PreparedStatement
- RequestDispatcher
- ResultSet
- Runnable
- SELECT
- SequenceInputStream
- Serializable
- ServletConfig
- ServletContext
- size
- SQLインジェクション
- Statement
- Thread
- Timestamp
- TreeMap
- UPDATE
- WHERE
- Xerces
- アルゴリズム
- イテレーター
- イベント
- イベントリスナー
- インタフェイス
- インタフェース
- インターフェイス
- インターフェイス修飾子
- インターフェース
- イントロスペクション
- キャッシュ
- クエリー
- クッキー
- クラス
- クラスメンバ
- コネクション
- コミット
- コレクション
- コレクションフレームワーク
- コンクリートクラス
- サブインターフェイス
- ジェネリッククラス
- ジェネリックメソッド
- ステートメント
- スーパーインターフェイス
- セッションID
- セッションスコープ
- ソート
- ディスパッチャー
- トランザクション
- ハンドラ
- ビュー
- フォーカス
- ブロックします
- プリペアードステートメント
- ボタン
- マルチスレッド
- モデル
- リクエストスコープ
- レスポンス
- レスポンスヘッダー
- ロールバック
- 修飾子
- 列
- 匿名クラス
- 完全修飾クラス名
- 完全修飾名
- 実装
- 実装クラス
- 抽象クラス
- 抽象メソッド
- 直列化
- 行
- 辞書
- 配列
- 降順
「サンプルプログラムとか」に含まれているページ
- <jsp:useBean>
- abstractクラス
- abstractメソッド
- Application Program Interface
- Application Programming Interface
- AWT
- CharSequence
- clone
- Cloneable
- CloneNotSupportedException
- Collection
- Comparable
- Comparator
- compareTo
- DOM
- DTD
- Enumeration
- execute
- finalクラス
- Frame
- GUI
- HttpServletResponse
- implements
- interface
- JavaBeans
- JSP暗黙オブジェクト「config」
- JSP暗黙オブジェクト「pageContext」
- JSP暗黙オブジェクト「response」
- Map
- MVC
- Node
- ObjectInputStream
- ObjectOutputStream
- PageContext
- PreparedStatement
- ResultSet
- SELECT
- Serializable
- ServletConfig
- SQLインジェクション
- transient
- web.xml
- WHERE
- XML
- インタフェイス
- インタフェース
- インターフェイス
- インターフェイス修飾子
- インターフェース
- エラーハンドラ
- クエリー
- コレクションフレームワーク
- コンクリートクラス
- コントローラー
- サブインターフェイス
- シーケンス
- ジェネリッククラス
- スーパーインターフェイス
- ソート
- ダイアログ
- ビュー
- ブロックします
- プリペアードステートメント
- メッセージボックス
- モデル
- モーダルダイアログ
- モードレスダイアログ
- レコード
- 匿名クラス
- 完全修飾名
- 実装
- 実装クラス
- 抽象クラス
- 直列化
- 行