詳細継承(下) - superキーワードとポリモーフィズム

接続ボーエン- 「詳細(上)の継承-抽象とレイヤードツール」
トピックに騒ぎ、:

スーパーでパートI「トリック」、()では、この問題を解決するため、これはなぜですか?
答え:サブクラスのコンストラクタのすべてのデフォルト値は、親クラスにアクセスしますコンストラクタ空のパラメータを
(拡張:この原理を、私たちは「将来的にやるのでツール」引数なしのコンストラクタを持参しなければなりません)

まあ、それは引数なしで親クラスのコンストラクタ、操作方法のサブクラス?

いかなる手段は、引数なしの親のコンストラクタを解決しません

  • では、親 1つの追加するには、引数なしでコンストラクタを
  • サブクラス、スーパーの他のパラメータを持つ親クラスのコンストラクタを呼び出すために
  • サブクラスこのスルーは、他のコンストラクタのこのクラスを呼び出すために(この他のクラスの構造は、最初に親クラスのコンストラクタにアクセスする必要があります)

さて、今、私はスーパーそれを説明する必要があります。

素晴らしい:

スーパークラスは、実際にスーパー、基底クラス、親クラスの意味です。

私がいることを思い出させるためにここにいます:

Objectクラスは、すべてのクラスの基本クラス

2つのスーパー厳格な要件があります。

  1. それが唯一のコンストラクタで表示されます。
  2. スーパー()した場合、それは最初の文のコンストラクタでなければなりません
    (そう、スーパー()、およびこの()と同じコンストラクタで同時に発生することはできません)

そして、私たちは、サブクラスでコンストラクタかどうかは、パラメータまたはパラメータで、デフォルトでは、JVMが唯一のノンパラメトリック基底クラスのコンストラクタ呼び出しではありません!

私たちは前のブログ記事の冒頭で述べたように、我々は、プロセスの「継承」の「継承のメリット」、私はどのように「メリットベースの継承」という点で、今離陸することができます:

この結果を達成するための我々の方法は次のとおりです覆っ方法
さて、今私たちがしなければならないにメソッドをカバーするライン以下の説明を

クラスのみの関係継承が存在する(1)、
(2)サブクラスのメソッド名名引数の数タイプ、および親が覆われた一貫していなければならない;
(3)サブクラス戻り値でなければなりません一貫したカバード親;
(4)サブクラスのメソッドモディファイできない分類を覆う「下」、
(5)(2)の違反が、実質的にオーバーロードされたメソッドは、覆われていない場合

(私はここだけの学生が表紙にのみ、ここで、コードの後ろを理解させるために、フォローアップのブログ記事は、自分自身の詳細な説明のための方法をカバーします)

:それでは、簡単な興味深い例みましょう
レッツ・ビルドパッケージcom.mec.about_override.demoを、そしてパッケージの次のクラスの確立:
Animal.java:

package com.mec.about_override.demo;

public class Animal {
    private String name;
    
    public Animal(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public void cry() {
        System.out.println("动物的叫声!");
    }
    
}

Dog.java:

package com.mec.about_override.demo;

public class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
    
    public void cry() {
        System.out.println("汪汪");
    }
}

Demo.java:

package com.mec.about_override.demo;

public class Demo {

    public static void main(String[] args) {
        Animal animal =new Animal("动物");
        animal.cry();

        Dog dog = new Dog("二愣子");
        dog.cry();
    }
}

:私たちは、今コンパイルし、その結果は次の通りです
ここに画像を挿入説明。図からわかるように、私たちは動物のクラス書か叫び(している)メソッドが覆われています!

ポリモーフィック:

今、私たちは、この記事の別のポイントを導入するための知識がある- 多型

ポリモーフィズム -一つのこと、で異なる時間明らかに異なる状態に

首先,多态是有 条件的:

多态前提

  • 要有继承关系
  • 要有覆盖(方法重写)
    其实没有也是可以的,但是如果没有这个就没有意义
  • 要有父类引用指向子类对象
    形如:
    父 f = new 子();

接下来,本人来讲解一个非常有趣的 知识点:
基类 与 派生类 之间的 强制类型转换:
我们对上面的 Dog类 和 Demo类 做如下修改:
Dog.java:

package com.mec.about_override.demo;

public class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
    
    public void cry() {
        System.out.println("汪汪");
    }
    
    public void dogAction() {
        System.out.println("狗子快跑!");
    }
}

Demo.java:

package com.mec.about_override.demo;

public class Demo {

    public static void main(String[] args) {
        Animal animal =new Animal("动物");
        animal.cry();
        
        Dog dog = new Dog("二愣子");
        dog.cry();
        
        Animal otherAnimal = (Animal) dog;
        dog.dogAction();
        dog.cry();
    }
    
    
}

运行结果如下:
ここに画像を挿入説明
现在可能就有同学有疑问了这里的输出结果竟然是“汪汪”而不是“动物的叫声”!

这里对上述问题做出解释:

基类 与 派生类 之间的 强制类型转换 遵循如下原则

  1. 对象的类型 约束 对象所能引用成员方法,但是,不能更改 成员 和 方法 的本质内容;
  2. 对于方法,强转不能改变 其所 实际指向 的 代码 的首地址; 对象 的类型 决定 对象 所能引用的 对象和方法 的种类(即:Animal类型); 对象 所能调用的 成员 和 方法 取决于所申请空间的 对象和方法(即:Dog类型);
  3. サブクラスオブジェクトは、強い親クラス・タイプに変換することができるが、サブクラスのメンバーおよび方法のタイプは、親クラス・オブジェクト内に存在しなくてもよいので、親オブジェクトは、サブクラス強いタイプに変換することができません

上記の現象については、おそらく初心者の学生は少しめまいを感じ、基本クラスとサブクラスの関係になります。
ここでは、心配しないで、私も同じような知識のポイントを紹介します、それらの間の関係を識別するために、私たちを支援します:

ポリモーフィックメンバーアクセス機能

  • メンバー変数:
    コンパイルの外観は一見の実行を左に、左に。
  • コンストラクタ:
    あなたは、オブジェクトのサブクラスを作成する場合、親クラスのコンストラクタを訪問するには、親クラスのデータが初期化されます。
  • メンバー方法:
    コンパイル外観は、実行するために右に見て左に。
  • 静的メソッド:
    コンパイルルックルックを実行するために左に、左に。
    (訪問の左にあるように、静的およびクラス関連は、本当に、書き換えません)

では、なぜこの多型のメカニズムの存在?

ポリモーフィックな利点

  1. コードのメンテナンス性を向上(継承保証)
  2. (多型保証)の向上、スケーラビリティコード

だから、すべての知識は、専用ああ(ハハ、この少し、それが行わ説明し、このブログはすでに午前中に日午前3時17分を終えて、私は死ぬにはあまりにも眠くた、視認される継承された良心のブロガー)Wuguai、文句を言います。
あなたが疑問を持っている場合は、知識やコードに関するコメントや提案は、上げ以下のコメントエリアに、私はあなたに感謝し、ヘルプの学生が少し賞賛の賞賛を残すことを、できるだけ早く回答されます!

おすすめ

転載: www.cnblogs.com/codderYouzg/p/12385960.html