ホームページ > Java > &#&チュートリアル > 03.Javaの基礎 - ポリモーフィズム

03.Javaの基礎 - ポリモーフィズム

黄舟
リリース: 2017-02-27 10:13:11
オリジナル
1403 人が閲覧しました

基本概念

ポリモーフィズムは、同じ動作が複数の異なる発現または形式を持つ能力です。

ポリモーフィズムは、オブジェクトの複数の表現を具体化したものです。

ポリモーフィズムの条件: 継承、書き換え、上方変換

動的バインディングは、ポリモーフィック実装の特定の形式です。


ケーススタディ

以下は、上記の概念を検証するための例です。

// 车class Car {    public void show(){
        System.out.println("This is a car");
    }
}//丰田class Toyota extends Car{    public void show(){
        System.out.println("This is a Japan car");
    }
}//别克class Buick extends Car{    public void show(){
        System.out.println("This is a USA car");
    }
}public class Test{  
    public static void main(String[] args) {
        Car c1 = new Toyota();
        Car c2 = new Buick();
        c1.show();
        c2.show();        // 打印内容:
        // This is a Japan car
        // This is a USA car
    }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

コードを観察すると、Car の show メソッドを呼び出すと、クラスのポリモーフィズムを反映する異なるコンテンツが出力されます。同時に、この例はポリモーフィズムが発生する 3 つの基本条件も満たしています:

  • 継承: Toyota と Buick は Car

  • Rewrite: Toyota と Buick が Car

    の show メソッドを書き換えます。
  • アップキャスト: トヨタとビュイックのオブジェクトを作成するときにアップキャストが発生します


典型的な質問を見てみましょう:

class A {    public String show(A obj) {        return ("A and A");
    }    public String show(D obj) {        return ("A and D");
    }
}

class B extends A {    public String show(A obj) {        return ("B and A");
    }    public String show(B obj) {        return ("B and B");
    }
}

class C extends B {
}

class D extends B {
}public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();        // 1.因此 B 是 A 的子类,调用类 A 的 show(A obj) 方法,输出:A and A
        System.out.println(a1.show(b));        // 2.因为 C 是 A 的子类,调用类 A 的 show(A obj) 方法,输出:A and A
        System.out.println(a1.show(c));        // 3.调用类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(a1.show(d));        // 4.因为 B 向上转型成 A, 且 B 是 A 的子类,调用类 A 的 show(A obj) 方法
        // 但是由于 B 中重写了 show(A obj) 方法,导致运行期间发生的动态绑定,调用 类 B 的 show(A obj) 方法
        // ,输出:B and A
        System.out.println(a2.show(b));        // 5.同上
        System.out.println(a2.show(c));        // 6.B 向上转型成 A,默认调用类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(a2.show(d));        // 7.调用类 B 的 show(B obj) 方法,输出:B and B
        System.out.println(b.show(b));        // 8.C 是 B 的子类,调用类 B 的 show(B obj) 方法,输出:B and B
        System.out.println(b.show(c));        // 9.调用继承自类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(b.show(d));

    }
}
ログイン後にコピー
ログイン後にコピー

コンストラクターとポリモーフィズム

も例を通して検討します

class Parent {    void print() {
        System.out.println("I am a Parent");
    }

    Parent() {
        print();
    }
}

class Son extends Parent {    int num = 1;    // 重写(override)了父类方法
    void print() {
        System.out.println("I am a Son " + num);
    }

    Son() {
        print();
    }
}public class Test {
    public static void main(String[] args) {
        Son son = new Son();        /**
         * 输出内容: 
         * I am a Son 0
         * I am a Son 1
         */
    }
}
ログイン後にコピー
ログイン後にコピー

出力内容を見ると、動的バインディングにより Parent のコンストラクターが Son の print() を呼び出していることがわかります。num は初期化されていないため、値は 0 です。

基本概念

ポリモーフィズムとは、同じ動作が複数の異なる表現や形式を持つ能力です。

ポリモーフィズムは、オブジェクトの複数の表現を具体化したものです。

ポリモーフィズムの条件: 継承、書き換え、上方変換

動的バインディングは、ポリモーフィック実装の特定の形式です。


ケーススタディ

以下は、上記の概念を検証するための例です。

// 车class Car {    public void show(){
        System.out.println("This is a car");
    }
}//丰田class Toyota extends Car{    public void show(){
        System.out.println("This is a Japan car");
    }
}//别克class Buick extends Car{    public void show(){
        System.out.println("This is a USA car");
    }
}public class Test{  
    public static void main(String[] args) {
        Car c1 = new Toyota();
        Car c2 = new Buick();
        c1.show();
        c2.show();        // 打印内容:
        // This is a Japan car
        // This is a USA car
    }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

コードを観察すると、Car の show メソッドを呼び出すと、クラスのポリモーフィズムを反映する異なるコンテンツが出力されます。同時に、この例はポリモーフィズムが発生する 3 つの基本条件も満たしています:

  • 継承: Toyota と Buick は Car

  • Rewrite: Toyota と Buick が Car

    の show メソッドを書き換えます。
  • アップキャスト: トヨタとビュイックのオブジェクトを作成するときにアップキャストが発生します


典型的な質問を見てみましょう:

class A {    public String show(A obj) {        return ("A and A");
    }    public String show(D obj) {        return ("A and D");
    }
}

class B extends A {    public String show(A obj) {        return ("B and A");
    }    public String show(B obj) {        return ("B and B");
    }
}

class C extends B {
}

class D extends B {
}public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();        // 1.因此 B 是 A 的子类,调用类 A 的 show(A obj) 方法,输出:A and A
        System.out.println(a1.show(b));        // 2.因为 C 是 A 的子类,调用类 A 的 show(A obj) 方法,输出:A and A
        System.out.println(a1.show(c));        // 3.调用类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(a1.show(d));        // 4.因为 B 向上转型成 A,应该是调用类 A 的 show(A obj) 方法
        // 由于 B 中重写了 show(A obj) 方法,实际调用 类 B 的方法,,输出:B and A
        System.out.println(a2.show(b));        // 5.同上
        System.out.println(a2.show(c));        // 6.B 向上转型成 A,默认调用类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(a2.show(d));        // 7.调用类 B 的 show(B obj) 方法,输出:B and B
        System.out.println(b.show(b));        // 8.C 是 B 的子类,调用类 B 的 show(B obj) 方法,输出:B and B
        System.out.println(b.show(c));        // 9.调用继承自类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(b.show(d));

    }
}
ログイン後にコピー

コンストラクターとポリモーフィズム

も例を通して調べます

class Parent {    void print() {
        System.out.println("I am a Parent");
    }

    Parent() {
        print();
    }
}

class Son extends Parent {    int num = 1;    // 关键 -> 重写了父类的方法
    void print() {
        System.out.println("I am a Son " + num);
    }

    Son() {
        print();
    }
}public class Test {
    public static void main(String[] args) {
        Son son = new Son();        // 输出内容: 
        // I am a Son 0
        // I am a Son 1
    }
}
ログイン後にコピー

結果実際に 3 つのコンテンツが含まれていることを示します:

  • Son インスタンス化のプロセスでは、Parent のコンストラクターと Parent のコンストラクターが最初に実行されます。

  • Son は print メソッドをオーバーライドするため、Parent は Son の書き換えられたメソッドを呼び出します。

  • Parentではnumがまだ初期化されていないため、値は0です。

基本概念

ポリモーフィズムは、同じ動作が複数の異なる発現または形式を持つ能力です。

ポリモーフィズムは、オブジェクトの複数の表現を具体化したものです。

ポリモーフィズムの条件: 継承、書き換え、上方変換

動的バインディングは、ポリモーフィック実装の特定の形式です。


ケーススタディ

以下は、上記の概念を検証するための例です。

// 车class Car {    public void show(){
        System.out.println("This is a car");
    }
}//丰田class Toyota extends Car{    public void show(){
        System.out.println("This is a Japan car");
    }
}//别克class Buick extends Car{    public void show(){
        System.out.println("This is a USA car");
    }
}public class Test{  
    public static void main(String[] args) {
        Car c1 = new Toyota();
        Car c2 = new Buick();
        c1.show();
        c2.show();        // 打印内容:
        // This is a Japan car
        // This is a USA car
    }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

コードを観察すると、Car の show メソッドを呼び出すと、クラスのポリモーフィズムを反映する異なるコンテンツが出力されます。同時に、この例はポリモーフィズムが発生する 3 つの基本条件も満たしています:

  • 継承: Toyota と Buick は Car

  • Rewrite: Toyota と Buick が Car

    の show メソッドを書き換えます。
  • アップキャスト: トヨタとビュイックのオブジェクトを作成するときにアップキャストが発生します


典型的な質問を見てみましょう:

class A {    public String show(A obj) {        return ("A and A");
    }    public String show(D obj) {        return ("A and D");
    }
}

class B extends A {    public String show(A obj) {        return ("B and A");
    }    public String show(B obj) {        return ("B and B");
    }
}

class C extends B {
}

class D extends B {
}public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();        // 1.因此 B 是 A 的子类,调用类 A 的 show(A obj) 方法,输出:A and A
        System.out.println(a1.show(b));        // 2.因为 C 是 A 的子类,调用类 A 的 show(A obj) 方法,输出:A and A
        System.out.println(a1.show(c));        // 3.调用类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(a1.show(d));        // 4.因为 B 向上转型成 A, 且 B 是 A 的子类,调用类 A 的 show(A obj) 方法
        // 但是由于 B 中重写了 show(A obj) 方法,导致运行期间发生的动态绑定,调用 类 B 的 show(A obj) 方法
        // ,输出:B and A
        System.out.println(a2.show(b));        // 5.同上
        System.out.println(a2.show(c));        // 6.B 向上转型成 A,默认调用类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(a2.show(d));        // 7.调用类 B 的 show(B obj) 方法,输出:B and B
        System.out.println(b.show(b));        // 8.C 是 B 的子类,调用类 B 的 show(B obj) 方法,输出:B and B
        System.out.println(b.show(c));        // 9.调用继承自类 A 的 show(D obj) 方法,输出:A and D
        System.out.println(b.show(d));

    }
}
ログイン後にコピー
ログイン後にコピー

コンストラクターとポリモーフィズム

も例を通して検討します

class Parent {    void print() {
        System.out.println("I am a Parent");
    }

    Parent() {
        print();
    }
}

class Son extends Parent {    int num = 1;    // 重写(override)了父类方法
    void print() {
        System.out.println("I am a Son " + num);
    }

    Son() {
        print();
    }
}public class Test {
    public static void main(String[] args) {
        Son son = new Son();        /**
         * 输出内容: 
         * I am a Son 0
         * I am a Son 1
         */
    }
}
ログイン後にコピー
ログイン後にコピー

出力内容を見ると、動的バインディングにより Parent のコンストラクターが Son の print() を呼び出していることがわかります。num は初期化されていないため、値は 0 です。

分析結果には実際には 3 つの内容が含まれます:

  • Son インスタンス化のプロセスでは、Parent のコンストラクターと Parent のコンストラクターが最初に実行されます。

  • Son は print メソッドをオーバーライドするため、Parent は Son の書き換えられたメソッドを呼び出します。

  • Parentではnumがまだ初期化されていないため、値は0です。

上記は 03.Java の基礎 - ポリモーフィック コンテンツです。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート