Java 参照型には 2 つの型があります。1 つはコンパイル時型、もう 1 つは実行時型です。コンパイル時の型は変数の宣言時に使用された型によって決まり、実行時の型は変数に実際に割り当てられたオブジェクトによって決まります。コンパイル時の型と実行時の型が一致しない場合、いわゆるポリモーフィズムが発生する可能性があります。
public class BaseClass { public int book = 6; public void base() { System.out.println("父类中的普通方法"); } public void text() { System.out.println("父类中被覆盖的方法"); } }
public class subClass extends BaseClass{ public String book ="java"; public void text() { System.out.println("子类中覆盖父类的方法"); } public void sub() { System.out.println("子类中的普通方法"); } public static void main(String[] args) { //下面编译时类型和运行时类型完全一样,所以不存在多态 BaseClass bc = new BaseClass(); System.out.println(bc.book); //下面两次调用的是BaseClass的方法 bc.text(); bc.base(); subClass sc = new subClass(); System.out.println(sc.book); //下面调用的是subClass类的方法 sc.sub(); sc.text(); //下面编译时类型与运行时类型是不一样的,就是所谓的多态 BaseClass bs = new subClass(); System.out.println(bs.book); bs.text(); bs.base(); //bs.sub(); //bs是父类的类型,他访问的是父类的shi'li'bian'liang } }
上記のプログラムの main() メソッドで 3 つの変数が作成されます。最初の 2 つの参照変数はコンパイル時型と実行時型が同じなので、それらのメンバー変数とメンバー メソッドを呼び出すのが通常です。ただし、2 番目の 3 つの変数のコンパイル時の型は、この参照変数のテキスト メソッドが呼び出されるとき、親クラスで定義され、実際に実行されるメソッドでオーバーライドされます。親クラスのメソッドでオーバーライドされます。
Java では、型変換を行わずにサブクラスのオブジェクトを親クラスの参照変数に直接代入することができます。この変換はシステムによって自動的に行われます。
変数を参照するメソッドが実行時に呼び出される場合、そのメソッドの動作は、親クラスの動作特性ではなく、常にサブクラスの動作特性を示します。これは、呼び出し時に同じ型の変数がレンダリングされる可能性があります。親クラスの動作特性ではなく、異なる動作特性をポリモーフィズムと呼びます。
メソッドとは異なり、オブジェクトのインスタンス変数には多態性がありません。
结果: 6 父类中被覆盖的方法 父类中的普通方法 java 子类中的普通方法 子类中覆盖父类的方法 6 子类中覆盖父类的方法 父类中的普通方法
以上がJava におけるポリモーフィズムの補足の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。