以前はクラスを使用して新しい型を作成し、継承を使用してクラスを作成するプロセスを容易にしました。この講義では、型について詳しく説明し、ポリモーフィズムの概念を紹介します。
型チェック
Java の変数と参照は、型宣言を渡した後でのみ使用できます。オブジェクト データ、クラス データ、メソッド パラメーター、メソッドの戻り値、およびメソッド内の自動変数はすべて、型を宣言する必要があることを前に説明しました。 Java は型をチェックする、厳密に型指定された言語です。間違った型を使用すると、エラーが発生します。
タイプが一致しません、可愛さは無効です
たとえば、以下の Test クラスでは、Cup クラス オブジェクトを Person クラス参照に割り当てます。
public class Test{ public static void main(String[] args) { Human aperson; aperson = new Cup(); }}class Human{ /** * コンストラクター */ public Human(int h) { this.height = h; } /** * アクセサー */ public int getHeight() { return this.height; } /** * mutator */ public void giveHeight(int h) { this.height = this.height + h } int height;}class Cup { public void addWater(int w) { this.water = this.water + w; } public void DrinkWater(int w) { this.water = this.water - w } private int Water = 0; ;}
javac は以下を返します:
見つかりました:Cuprequired:Human aperson = new Cup();
基本的な型変換
Java は、基本型の変数に対して型変換を実行できます。基本タイプが異なれば、長さや収納範囲も異なります。 float から int への変換など、高精度型から低精度型に変換すると、情報が失われる可能性があります。このような変換をナローニング変換と呼びます。この場合、次のように型変換を明示的に宣言する必要があります。
public class Test{ public static void main(String[] args) { int a; // 縮小変換 System.out.println(a);
低精度タイプから高精度タイプに変換しても情報損失の心配はありません。このような変換をワイドニング変換と呼びます。明示的に型変換を要求する必要はなく、Java が自動的に型変換を行うことができます。
public class Test{ public static void main(String[] args) { int a = 3; // 拡張変換 System.out.println(a);
基本的な型変換
アップキャストとポリモーフィズム
Java では、参照を型キャストすることもできますが、制限があります。
派生クラス参照をその基本クラス参照に変換できます。これは、アップキャスト変換またはリラックス変換と呼ばれます。次の BrokenCup クラスは Cup クラスから継承し、Cup クラスの元の addWater() メソッドと DrinkWater() メソッドをオーバーライドします。
public class Test{ public static void main(String[] args) { Cup aCup; aBrokenCup = new BrokenCup(); // upcast aCup.addWater(10); // メソッド バインディング }} void addWater(int w) { this.water = this.water + w } public void DrinkWater(int w) { this.water = this.water - w; } private int Water = 0;} class BrokenCup extends Cup{ public void addWater(int w) { System.out.println("クソ、壊れたカップ") } public void DrinkWater(int w); println("om...num...、中に水がありません");
プログラムの実行結果:
クソ、割れたカップ
上でわかるように、明示的な指示なしで、派生クラス参照 aBrokenCup をその基本クラス参照 aCup に割り当てます。型変換は Java によって自動的に行われます。
次に、aCup (Cup 型であると宣言した) の addWater() メソッドを呼び出しました。 aCup は Cup 型の参照ですが、実際には BrokenCup の addWater() メソッドを呼び出します。言い換えれば、アップキャストによって基本クラスへの参照型を緩めたとしても、Java は依然としてオブジェクト自体の型を正しく識別し、正しいメソッドを呼び出すことができます。 Java は現在の状況に基づいてオブジェクトの真の型を識別できます。これはポリモーフィズムと呼ばれます。ポリモーフィズムはオブジェクト指向の重要な側面です。
ポリモーフィズムは Java でサポートされているメカニズムであり、オブジェクト指向の重要な概念でもあります。これは、サブクラス オブジェクトが実際に親クラス オブジェクトであるかどうかという分類上の疑問を引き起こします。たとえば、鳥も動物ですし、車も移動手段でなければなりません。 Java は、派生クラス オブジェクトを基本クラス オブジェクトとして使用できることを通知し、Java はこの状況を正しく処理します。
たとえば、次のような継承関係があります。
私たちはコップから水を飲むと言えます。実際、水を飲むという行為の具体的な意味は、派生クラスでは大きく変わります。たとえば、私たちは抽象的に「飲料水」について話しますが、ストローで水を飲むのと、割れたカップで水を飲むのは大きく異なります。もちろん、派生クラスごとに個別にプログラムして、異なるドリンクウォーター メソッドを呼び出すこともできます。ただし、プログラマとして、カップがどのような種類の派生カップであるかに関係なく、カップをプログラムしてカップの DrinkWater() メソッドを呼び出すことができます。上記のプログラムでわかるように、Java は対応する正しいメソッドを呼び出します。
より意味のある例として、 Drink() メソッドを Human クラスに追加します。このメソッドは、カップ オブジェクトと整数をパラメータとして受け取ります。整数は飲む水の量を表します。
public class Test{ public static void main(String[] args) { Human guest = new Human(); hisCup = new BrokenCup(); }}class Human { void Drink(Cup aCup); , int w) { aCup. DrinkWater(w) }}
プログラムの実行結果:
クソ、中に水が入ってない
Human クラスの Drink() の定義では、最初のパラメータが Cup 型の参照である必要があります。ただし、実際のアプリケーション(Testクラス)では、CupのBrokenCup派生クラスオブジェクトが使用されます。これは実際に hisCup を Cup クラスにアップキャストし、それを Drink() メソッドに渡します。このメソッドでは、 DrinkWater() メソッドを呼び出しました。 Java は、このオブジェクトが実際には BrokenCup オブジェクトであることを発見したため、実際に BrokenCup の対応するメソッドを呼び出しました。
意気消沈した
基本クラス参照を派生クラス参照にダウンキャストできますが、基本クラス参照が指すオブジェクトはすでにダウンキャストされる派生クラス オブジェクトです。たとえば、上記の hisCup は、Cup クラス参照に上向きに変換し、次に BrokenCup クラス参照に下向きに変換できます。
オブジェクトの種類
Java では、実際にはすべてのクラスに共通の継承の祖先、つまり Object クラスがあります。 Object クラスは、toString() などのいくつかのメソッドを提供します。これらのメソッドを独自のクラス定義でオーバーライドできます。
オブジェクト: 祖先
Object オブジェクトを操作するプログラムを作成し、アップキャストを通じて任意のオブジェクトをプログラムに渡すことができます。
Object クラスについては後ほど詳しく説明します。
(ポリモーフィズムの実装は RTTI サポートに依存しています。詳しくは後ほど説明します。)
要約する
基本的な型変換
多態性
意気消沈した
物体