JAVA の
ポリモーフィズムは、オブジェクトの複数の表現を具体化したものです。 オブジェクト指向では、最も一般的なポリモーフィズムは、親クラスの参照を使用してサブクラスのオブジェクトを参照するときに発生します。以下の記事で主に紹介していますので、必要な方は参考にしてください
1. ポリモーフィズムとは何ですか?
1. ポリモーフィズム
の定義は、異なるタイプのオブジェクトが同じメッセージに応答できることを指します。つまり、同じメッセージは、送信オブジェクトに応じてさまざまな動作メソッドを採用できます(メッセージの送信は関数呼び出しです)
2. ポリモーフィズム
の役割により、結合関係が排除されます。タイプ間
3. ポリモーフィックな説明
現代には非常に多くのオンライン小説があります。それを例として挙げます
ある日、あなたはあなたの携帯電話に複数の小説が更新されていることに気づきました同時に、The Great Master、Snow Eagle Lord、The Legend of the Dragon Kingなど...ここでは次のように説明できます:
小説a=大王小説b=スノーイーグルロード小説c =竜王伝説…ここに示されているのはポリモーフィズムであり、大王、雪鷲王、竜王伝説はすべて小説のサブカテゴリです。 の親カテゴリだけでさまざまなサブカテゴリを参照できます。これはポリモーフィズムです。実行時に参照 DZZ a=new DZZ();このコードについては何も感じないはずです。これは大きなマスター オブジェクトをインスタンス化するだけです。では、次のコードはどうでしょうか?XS a=new DZZ();ここでは、このように理解します。ここでは XS 型 a が定義されており、それがDZZ オブジェクト インスタンス
を指すものとします。 DZZ はXS
から継承しているため、DZZ は自動的に XS に上向きに変換でき、そのため、 a は DZZ インスタンス オブジェクトを指すことができます。これを行うことには非常に大きな利点があります。サブクラスを指す親クラスの参照型を定義すると、サブクラスが親クラスの拡張であることがわかります。 、親クラスの共通機能を参照できることに加えて、サブクラスの強力な機能も使用できます。ただし、上方変換にはいくつかの欠点もあります。一部のメソッドとプロパティが失われ、それらを取得できなくなります。したがって、親クラス型のアプリケーションは、親クラスで定義されているすべてのプロパティとメソッドを呼び出すことができますが、サブクラスにのみ存在するメソッドやプロパティには到達できません
public class XS { public void fun1() { System.out.println("XS中的fun1"); fun2(); } public void fun2() { System.out.println("XS中的fun2"); } }
public class DZZ extends XS{ /* * 子类重载父类方法 * 父类中不存在该方法,向上转型后,父类是不能引用该方法的 */ public void fun1(String a) { System.out.println("DZZ中的fun1"); fun2(); } /* * 子类重写父类方法 * 调用必定使用这个方法 */ public void fun2() { System.out.println("DZZ中的fun2"); } }
public class DuoTaiTest { public static void main(String[] args) { XS a=new DZZ(); a.fun1(); } } output: XS中的fun1 DZZ中的fun2
オブジェクト指向の場合、ポリモーフィズムはコンパイル時ポリモーフィズムに分割され、実行されます編集時のポリモーフィズムは 静的 で、主にメソッドのオーバーロードを指します。編集後は 2 つの異なる関数がポリモーフィックであるとは言えません。実行時のポリモーフィズムは動的であり、動的バインディングによって実現されます。これをポリモーフィズムと呼びます。
2. ポリモーフィズムの実装
書き換え: サブクラスは親クラスの特定のメソッドを再定義し、これらのメソッドが呼び出されるときに、サブクラスのメソッドも呼び出されます
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法
只有满足了上述三个条件,我们才能够在同一个继承结构中使用同一的逻辑实现代码处理不同的对象,从而达到执行不同的行为
对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法
2.实现形式
继承
public class XS { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public XS() { } public String drink() { return "你看的小说名字:"+getName(); } public String toString() { return null; } } public class DZZ extends XS{ public DZZ() { setName("DZZ"); } public String drink() { return "你看的小说名字:"+getName(); } public String toString() { return "小说名:"+getName(); } } public class XYLZ extends XS{ /** * */ public XYLZ() { setName("XYLZ"); } public String drink() { return "你看的小说名字:"+getName(); } public String toString() { return "小说名:"+getName(); } } public class DuoTaiTest { public static void main(String[] args) { XS [] xs=new XS[2]; DZZ a=new DZZ(); XYLZ b=new XYLZ(); xs[0]=a; xs[1]=b; for(int i=0;i<2;i++) { System.out.println(xs[i].toString()+"::::"+xs[i].drink()); } System.out.println("-------------------"); } } ouput: 小说名:DZZ::::你看的小说名字:DZZ 小说名:XYLZ::::你看的小说名字:XYLZ -------------------
在上面的代码中DZZ,XYLZ继承XS 并且重写了drink(),toString()方法,程序运行结果是调用子类中方法,输出DZZ,XYLZ的名称,这就是多态的表现。不同的对象可以执行相同的行为,但是他们都需要通过自己的实现方式来执行,这就要得益于向上转型了
我们都知道所有的类都继承自超类Object,toString()方法也是Object中方法,当我们这样写时:
Object o = new DZZ(); System.out.println(o.toString()); output: 小说名:DZZ
Object,XS,DZZ三者继承链关系是:DZZ—>XS—>Object。所以我们可以这样说:当子类重写父类的方法被调用时,只有对象继承链中的最末端的方法才会被调用。但是注意如果这样写:
Object o = new xs(); System.out.println(o.toString()); output: null//因为DZZ并不存在于该对象继承链中
所以基于继承实现的多态可以总结如下:对于引用子类的父类类型,在处理该引用时,它适用于继承该父类的所有子类,子类对象的不同,对方法的实现也就不同,执行相同动作产生的行为也就不同。
如果父类是抽象类,那么子类必须要实现父类中所有的抽象方法,这样该父类所有的子类一定存在统一的对外接口,但其内部的具体实现可以各异。这样我们就可以使用顶层类提供的统一接口来处理该层次的方法。
以上がJava におけるポリモーフィズムの概念とその原則的な実装についての詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。