Javaのポリモーフィズム を実行できる概念です。 単一のアクションをさまざまな方法で 。ポリモーフィズムは、ギリシャ語の 2 つの単語、poly と morphs に由来しています。 「ポリ」という言葉は多くを意味し、「モーフ」は形を意味します。したがって、ポリモーフィズムとはさまざまな形式を意味します。
数字で言えば100万
Java には、コンパイル時ポリモーフィズムと実行時ポリモーフィズムの 2 種類のポリモーフィズムがあります。 Javaでは、メソッドのオーバーロードとメソッドのオーバーライドによってポリモーフィズムを実行できます。
Java で静的メソッドをオーバーロードする場合、これはコンパイル時のポリモーフィズムの例です。ここでは、Java の実行時ポリモーフィズムに焦点を当てます。
Java の実行時ポリモーフィズム
ランタイムポリモーフィズム または 動的メソッドディスパッチ オーバーライドされたメソッドの呼び出しがコンパイル時ではなく実行時に解決されるプロセスです。
このプロセスでは、オーバーライドされたメソッドがスーパークラスの参照変数を通じて呼び出されます。呼び出されるメソッドの決定は、参照変数によって参照されるオブジェクトに基づいて行われます。
まず、実行時ポリモーフィズムの前のアップキャストについて理解しましょう。
アップキャスト
親クラスの参照変数が子クラスのオブジェクトを参照する場合、それはアップキャストと呼ばれます。例えば:
class A{} class B extends A{}
A a=new B();//upcasting
アップキャストの場合、クラス型またはインターフェイス型の参照変数を使用できます。例えば:
interface I{} class A{} class B extends A implements I{}
ここで、B クラスの関係は次のようになります。
scan.next Java
B IS-A A B IS-A I B IS-A Object
Object は Java のすべてのクラスのルート クラスであるため、B IS-A Object と書くことができます。
Java ランタイムポリモーフィズムの例
この例では、Bike と Splendor という 2 つのクラスを作成します。 Splendor クラスは Bike クラスを拡張し、その run() メソッドをオーバーライドします。親クラスの参照変数でrunメソッドを呼び出しています。これはサブクラス オブジェクトを参照し、サブクラス メソッドは親クラス メソッドをオーバーライドするため、サブクラス メソッドは実行時に呼び出されます。
メソッドの呼び出しはコンパイラではなく JVM によって決定されるため、ランタイムポリモーフィズムとして知られています。
class Bike{ void run(){System.out.println('running');} } class Splendor extends Bike{ void run(){System.out.println('running safely with 60km');} public static void main(String args[]){ Bike b = new Splendor();//upcasting b.run(); } }今すぐテストしてください
出力:
running safely with 60km.
Java ランタイムポリモーフィズムの例: 銀行
Bank が金利を取得するメソッドを提供するクラスであるシナリオを考えてみましょう。ただし、銀行によって金利が異なる場合があります。たとえば、SBI、ICICI、AXIS 銀行は 8.4%、7.3%、9.7% の金利を提供しています。
注: この例はメソッドのオーバーライドでも示されていますが、アップキャストはありませんでした。
class Bank{ float getRateOfInterest(){return 0;} } class SBI extends Bank{ float getRateOfInterest(){return 8.4f;} } class ICICI extends Bank{ float getRateOfInterest(){return 7.3f;} } class AXIS extends Bank{ float getRateOfInterest(){return 9.7f;} } class TestPolymorphism{ public static void main(String args[]){ Bank b; b=new SBI(); System.out.println('SBI Rate of Interest: '+b.getRateOfInterest()); b=new ICICI(); System.out.println('ICICI Rate of Interest: '+b.getRateOfInterest()); b=new AXIS(); System.out.println('AXIS Rate of Interest: '+b.getRateOfInterest()); } }今すぐテストしてください
出力:
SBI Rate of Interest: 8.4 ICICI Rate of Interest: 7.3 AXIS Rate of Interest: 9.7
Java ランタイムポリモーフィズムの例: 形状
class Shape{ void draw(){System.out.println('drawing...');} } class Rectangle extends Shape{ void draw(){System.out.println('drawing rectangle...');} } class Circle extends Shape{ void draw(){System.out.println('drawing circle...');} } class Triangle extends Shape{ void draw(){System.out.println('drawing triangle...');} } class TestPolymorphism2{ public static void main(String args[]){ Shape s; s=new Rectangle(); s.draw(); s=new Circle(); s.draw(); s=new Triangle(); s.draw(); } }今すぐテストしてください
出力:
drawing rectangle... drawing circle... drawing triangle...
Java ランタイムポリモーフィズムの例: 動物
class Animal{ void eat(){System.out.println('eating...');} } class Dog extends Animal{ void eat(){System.out.println('eating bread...');} } class Cat extends Animal{ void eat(){System.out.println('eating rat...');} } class Lion extends Animal{ void eat(){System.out.println('eating meat...');} } class TestPolymorphism3{ public static void main(String[] args){ Animal a; a=new Dog(); a.eat(); a=new Cat(); a.eat(); a=new Lion(); a.eat(); }}今すぐテストしてください
出力:
eating bread... eating rat... eating meat...
データメンバーを使用した Java ランタイムポリモーフィズム
データ メンバーではなくメソッドがオーバーライドされるため、データ メンバーによって実行時のポリモーフィズムを実現することはできません。
Javaのnullチェック
以下の例では、両方のクラスにデータ メンバーの速度制限があります。サブクラスオブジェクトを参照する親クラスの参照変数によってデータメンバーにアクセスしています。オーバーライドされていないデータ メンバーにアクセスしているため、常に親クラスのデータ メンバーにアクセスすることになります。
ルール: 実行時のポリモーフィズムはデータ メンバーによって実現できません。
class Bike{ int speedlimit=90; } class Honda3 extends Bike{ int speedlimit=150; public static void main(String args[]){ Bike obj=new Honda3(); System.out.println(obj.speedlimit);//90 } }今すぐテストしてください
出力:
90
マルチレベル継承による Java ランタイム ポリモーフィズム
マルチレベル継承を使用した実行時ポリモーフィズムの簡単な例を見てみましょう。
グライバッハ正規形
class Animal{ void eat(){System.out.println('eating');} } class Dog extends Animal{ void eat(){System.out.println('eating fruits');} } class BabyDog extends Dog{ void eat(){System.out.println('drinking milk');} public static void main(String args[]){ Animal a1,a2,a3; a1=new Animal(); a2=new Dog(); a3=new BabyDog(); a1.eat(); a2.eat(); a3.eat(); } }今すぐテストしてください
出力:
eating eating fruits drinking Milk
出力してみる
class Animal{ void eat(){System.out.println('animal is eating...');} } class Dog extends Animal{ void eat(){System.out.println('dog is eating...');} } class BabyDog1 extends Dog{ public static void main(String args[]){ Animal a=new BabyDog1(); a.eat(); }}今すぐテストしてください
出力:
Dog is eating
BabyDog は Eat() メソッドをオーバーライドしていないため、Dog クラスの Eat() メソッドが呼び出されます。