3つのTERのオブジェクト指向特性 - ポリモーフィズム


typora・コピー・イメージ-へ:画像

多型は何ですか?

例えば:

これは、一般的なオブジェクトを作成します。

猫の猫X =新しい();猫は、オブジェクトを作成し、猫のオブジェクトのx点のこのクラスへの参照によって、

ポリモーフィックオブジェクト:

アニマル×1 =新しい猫();この猫サブクラスオブジェクトへのX1親クラスの基準点。

猫を持っているだけでなく、動物の形状である。このリファレンス×1形。

簡単に言えば:つまり、異なる種類に対応するオブジェクトは、どのようにコードでそれを反映するために?親クラスまたはサブクラスオブジェクト参照点インタフェース。

三つの条件の多型が存在します。

  1. 持って継承関係を
  2. サブクラスは上書き継承されたメソッドを
  3. 親子クラスオブジェクトへの参照

ポリモーフィックの例

アニマルスーパー

class Animal {
    int num = 10;
    static int age = 20;

    public void eat() {
        System.out.println("动物吃饭");
    }
    public static void sleep(){
        System.out.println("动物睡觉");
    }
    public void run(){
        System.out.println("动物在奔跑");
    }
}

猫のサブクラス

class Cat extends Animal{
    int num  = 66;
    static int age = 40;
    String name = "tomCat";

    public void eat() {
        System.out.println("猫吃饭");
    }

    public static void sleep(){
        System.out.println("猫睡觉");
    }

    public void catMouse(){
        System.out.println("猫在抓老鼠");
    }
}

テストカテゴリ

/**
 * @ClassName: DuotaiDemo
 * @author: benjamin
 * @version: 1.0
 * @description: 多态举例
 */
public class DuotaiDemo {
    public static void main(String[] args) {

        // 父类引用指向了子类对象
        Animal am = new Cat();

        am.eat();
        am.sleep();
        am.run();

        System.out.println(am.num);
        System.out.println(am.age);
    }
}

結果

猫は食べて
寝ている動物
の実行時に動物を
10
20

私たちは、問題を発見しました

サブクラスは)(食べ非静的メンバメソッドをオーバーライド:猫の餌を

動物の睡眠:サブクラスは静的メンバメソッドの睡眠を()をオーバーライド

)(親クラスのメンバーメソッドがオーバーライドされていない実行をサブクラス:動物の運営に

要約:

メンバー変数:(親)を見るために左に実行し、左(親)に外観をコンパイルします

メンバーの方法:(サブクラス)を参照して右に実行し、左(親)に外観をコンパイルします

静的メソッド:多型のオブジェクトを含みません。負荷および負荷クラスとして静的関数ので。直接の呼び出しは、クラス名を使用することができます。

機能例

メンバ変数

簡単に言えば:コンパイラとランタイムは、等号の左側に参照されています

コンパイル時:リファレンス変数と呼ばれるクラスのメンバ変数が属するあり、ではなく、コンパイル、コンパイルに失敗。

ランタイム:リファレンス変数と呼ばれるクラスのメンバ変数が属する、と変数はクラスに属するメンバーを実行してあります。

例えば:

親スーパータイプを探すことによってケースサブタイプ昇降スーパー; DuotaiFu F =新しいDuotaiZi()を実行します

public class DuotaiDemo2 {
    public static void main(String[] args) {

        DuotaiFu f = new DuotaiZi();

        System.out.println(f.num);//3

    }

}
class DuotaiFu{
    int num = 3;
}

class DuotaiZi extends DuotaiFu{
    int num = 4;
}

グラフィックメモリ

メンバ関数(フォーカス)

非静的関数

簡単に言えば:右に、実行時の外観を残し、コンパイル時間を見て

編集:クラス変数が属する関数呼び出し参照がコンパイルに失敗し、コンパイルし、そこではありません。

ランタイム:参照がクラスオブジェクトが属するという関数があるかどうかです。

例えば:

表示機能は、この参照を保持し、オブジェクト0x0034(新しい紫())をポイントして実行され、オブジェクトが操作の表示方法を見出すことです。

public class DuotaiDemo2 {
    public static void main(String[] args) {

        DuotaiFu f = new DuotaiZi();
        f.show();
    }
}
class DuotaiFu{

     void show(){
         System.out.println("fu show...");
     }
}

class DuotaiZi extends DuotaiFu{
    void show(){
        System.out.println("zi show...");
    }
}
// zi show...

メモリー・イラスト:

静的機能

これは、多型のオブジェクトを必要としません。負荷および負荷クラスとして静的関数ので。直接の呼び出しは、クラス名を使用することができます。

編集:型の変数が属する静的メソッド呼び出しが参照されています。

ランタイム:型の変数が属する静的メソッド呼び出しが参照されています。

例えば:

非静的メソッドを実行するには、指定されたオブジェクトにバインドする必要があります。

package java_demo_2;

public class DuotaiDemo2 {
    public static void main(String[] args) {

        DuotaiFu f = new DuotaiZi();
        f.method();
        DuotaiFu.method();
        DuotaiZi.method();

    }

}
class DuotaiFu{

     void show(){
         System.out.println("fu show...");
     }

     static void method(){
         System.out.println("父类静态方法");
     }
}

class DuotaiZi extends DuotaiFu{
    void show(){
        System.out.println("zi show...");
    }
    static void method(){
        System.out.println("子类静态方法");
    }
}

結果:

親クラスの静的メソッドの
親クラスの静的メソッド
のサブクラスの静的メソッド

意気消沈し、アップキャスト

アップキャスト:

  • コンセプト:Animal a = new Cat();猫は動物の種類に上るが、猫特有の機能にアクセスできなくなります。
  • 目的:するには、特定の機能へのアクセスを制限し、専門的な話は上向きに推移です。

ダウンキャスト:

  • コンセプト:特定の動物の猫とのユニークな機能が必要な場合、あなたは意気消沈オブジェクトをすることができます。以下のような:

    猫C =(猫)です。

    c.catchMouse();

  • 目的:サブクラスで特定のメソッドを使用します。

例えば:

// 向上转型
Animal am = new Cat();
am.eat();

// 向下转型
Cat cat = (Cat) am;
cat.catMouse();
System.out.println(cat.name);

输出
猫在抓老鼠
tomCat

変換例外を入力します。

形質転換のために、最初から最後まで、私たちは変更のクラスのオブジェクト型で行っています。猫 - 動物 - 猫

Cat c2 = (Cat) d;
c2.catchMouse();//ClassCastException
// 不能把一个猫——动物——狗;报错

判断を入力します。

instanceof :唯一の一般前遷移決意耐性下方実行するために使用されるタイプを決定するためのデータを参照し、オブジェクトが特定のクラスのインスタンスであるかどうかを示します。

例えば:

public class DuotaiDemo {
    public static void main(String[] args) {
        //向上转型
        Animal c = new Cat();
        Animal d = new Dog();

        method(c);
        method(d);

    public static void method(Animal a){ 

        a.eat();
        if(a instanceof Cat){

            Cat c = (Cat) a;//向下转型,执行对象的特有方法;
            c.catchMouse();
        }
        else if(a instanceof Dog){
            Dog d = (Dog) a;
            d.lookHome();
        }
    }
}

参考リンク

いくつかの単語での多型は、それについての直感的なJAVAを説明することができますか?-犬のプログラムを回答-知っているほとんど
https://www.zhihu.com/question/30082151/answer/1205205​​68

おすすめ

転載: www.cnblogs.com/benjieqiang/p/11481801.html