目次
ポリモーフィズムの理解
上方変換
上方変換の 3 つの形式
動的バインディングと静的バインディング
メソッドの書き換え
进一步认识和理解多态
多态的优点
ホームページ Java &#&チュートリアル Java オブジェクト指向ポリモーフィック インスタンス分析

Java オブジェクト指向ポリモーフィック インスタンス分析

Apr 19, 2023 pm 01:34 PM
java

    ポリモーフィズムの理解

    ポリモーフィズムとは何ですか? ?文字通り、複数の形式として理解されます。つまり、異なるクラスからインスタンス化されたオブジェクトが同じメソッドを呼び出します。また、異なるクラスのオブジェクトが同じ動作の後に異なる状態を生成することも理解できます。これがポリモーフィズムです。

    ポリモーフィズムを理解するには、上向き変換と書き換えの 2 つの重要なポイントを理解してから、ポリモーフィズムの概念を深く理解する必要があります。上向き変換と書き換えを読んだ後、ポリモーフィズムの概念を見てみましょう。 、あなたは突然悟りを開き、一度に多くの明晰さを得るでしょう。ポリモーフィズムの条件は上方変換、書き換え、継承だからです。

    上方変換

    まずポリモーフィズムの前提は継承ですが、継承なので親クラスとサブクラスの間には関係がなければなりません。

    サブクラス オブジェクトと親クラス オブジェクトの作成方法を思い出してみましょう。

    class Animal{
        public String name;//名字
        public int age;
        public void eat() {
            System.out.println("我要吃饭!!!");
        }
        public void sleep() {
            System.out.println("我要睡觉!!!");
        }
    }
    class Cat extends Animal{
        public void mew() {
            System.out.println("喵喵喵!!!");
        }
    }
    public class TestDemo1 {
        public static void main(String[] args) {
             Cat cat =new Cat();//实例化子类对象
             cat.name="mimi";
             Animal animal = new Animal();//实例化父类对象
             animal.eat();
        }
    }
    ログイン後にコピー

    ここで cat クラスが作成され、Animal クラスを継承します。 Cat オブジェクトと Animal オブジェクトをインスタンス化することで、メソッドとプロパティを呼び出すことができます。

    それでは、上向きの変革とは何でしょうか? ? ?

    元々、サブクラスのオブジェクトの参照がサブクラスのオブジェクトを参照していたのが、親クラスの参照がサブクラスのオブジェクトを参照するという上方変換です。

    Java オブジェクト指向ポリモーフィック インスタンス分析

    コードを使用して理解しましょう:

    Java オブジェクト指向ポリモーフィック インスタンス分析

    これは上方変換です。親クラス参照も使用できます。動物の Call メソッド;

    Java オブジェクト指向ポリモーフィック インスタンス分析

    # 現時点では、この参照を使用して親クラスのメソッドとプロパティを呼び出すことができますが、メソッドを呼び出すことはできないことがわかります。とサブクラスのプロパティがあるのに、なぜ? ? ?その理由は、親クラスのサブクラスにこのメソッドがないため、呼び出すことができないためです。概要: 上方変換中、親クラス参照はサブクラス オブジェクトを参照します。この親クラス参照は、親クラスの属性とメソッドのみを呼び出すことができますが、サブクラスは呼び出すことができません。

    上方変換の 3 つの形式

    最初の形式: 直接代入

    これが上で書いた方法です:

      Animal animal1 = new Cat();//父类对象的引用 引用子类对象--->向上转型
      Animal animal2 = new Dog();
    ログイン後にコピー

    2 番目の形式:メソッドのパラメータ:

    Java オブジェクト指向ポリモーフィック インスタンス分析

    3 番目の型は戻り値です:

    Java オブジェクト指向ポリモーフィック インスタンス分析

    出力された結果に戻りましょう。 ;

    Java オブジェクト指向ポリモーフィック インスタンス分析

    #しかし、親クラスのメソッドを変更して、キャットフードを食べたいと言うようにしたらどうなるでしょうか?その結果、mimi がキャットフードを食べたがるのも不思議ではありません。

    しかし、これは問題を引き起こします。犬クラスを作成してから、eat メソッドを呼び出した場合、犬もキャットフードを食べる必要があるのでしょうか?これでは問題が発生するため、サブクラスに Eat メソッドを記述します。

    class Animal{
        public String name;//名字
        public int age;
        public void eat() {
            System.out.println(this.name+"要吃饭!!!");
        }
    }
    class Dog extends Animal{
        public void dark() {
            System.out.println("汪汪汪!!!");
        }
        public void eat() {
            System.out.println(this.name+"吃狗粮!!!");
        }
    }
    class Cat extends Animal{
        public void mew() {
            System.out.println("喵喵喵!!!");
        }
        public void eat() {
            System.out.println(this.name+"吃猫粮!!!");
        }
    }
    public class TestDemo1 {
        public static void main(String[] args) {
            //语法形式 : 父类 变量 = new 子类();
            Animal animal1 = new Cat();//父类对象的引用 引用子类对象--->向上转型
            Animal animal2 = new Dog();//父类对象的引用 引用子类对象--->向上转型
            animal1.name = "小猫";//访问父类属性
            animal2.name = "小狗";//访问父类属性
            animal1.eat();
            animal2.eat();
            // animal.mew();//访问子类特有的方法
        }
    }
    ログイン後にコピー

    この時点では、dog クラスが作成され、2 つのサブクラスに 2 つの Eat メソッドが作成されます。

    Java オブジェクト指向ポリモーフィック インスタンス分析

    # この時点で、私たちが望んでいた効果を達成することが非常に明確になったことがわかりました。

    しかし、もう一度考えてみましょう。なぜ親クラスではなくサブクラスの Eat メソッドを呼び出すのでしょうか?

    動的バインディングと静的バインディング

    動的バインディングはこの時点で実際に発生します。バイトコード ファイルを確認して PowerShell ウィンドウを開くことができます

    Java オブジェクト指向ポリモーフィック インスタンス分析

    ##プログラムを実行するには、まずコンパイルしてから実行する必要があることは誰もが知っています。コンパイル時に動物の Eat メソッドが呼び出され、実行時に cat メソッドが呼び出されます。これが私たちが行うことです。ランタイム バインディング、または動的バインディングと呼ぶこともできます。

    次に、動的バインディングがあるため、静的バインディングも存在する必要があります。

    動的バインディングはコンパイル時にメソッドを呼び出し、最終的に呼び出されるメソッドは実行時に決定されます。つまり、呼び出されるメソッドは実行時に決定されます。

    静的バインディングとは、呼び出すメソッドがコンパイル中に決定されることを意味します。

    その中で、動的バインディングの最も明白な代表的なものはメソッドの書き換えです。

    静的バインディングの最も明白な代表例は、メソッドのオーバーロードです。

    上記のメソッドを振り返ってみましょう ε=(´ο`*)))...なぜ前の Eat メソッドの戻り値、パラメータリスト、メソッド名がすべて同じなのか Woolen布?見てみましょう。

    Java オブジェクト指向ポリモーフィック インスタンス分析

    メソッドの書き換え

    メソッドのオーバーロードについては前に学習しました。メソッドのオーバーロードについて復習しましょう。メソッドのオーバーロードとは、メソッド名が同じであり、戻り値が同じであることを意味します。値が異なるため、リクエストを行う際のパラメータリストが異なります。今日学んだメソッドの書き換えとは、戻り値が同じ、メソッド名が同じ、パラメータリストが同じということをメソッド書き換えと言いますが、メソッドの上書きとも言えます。

    メソッドの書き換えにはいくつかの要件があります。

    メソッドの書き換えでは、同じメソッド名、同じメソッド パラメーター リスト、および同じメソッド戻り値が必要です。

    Java オブジェクト指向ポリモーフィック インスタンス分析

    ワンクリックでリライトを生成することもできます

    Java オブジェクト指向ポリモーフィック インスタンス分析

    有几个注意事项:

    Java オブジェクト指向ポリモーフィック インスタンス分析

    不能重写被private修饰的方法。

    Java オブジェクト指向ポリモーフィック インスタンス分析

    不能重写被final修饰的方法。

    Java オブジェクト指向ポリモーフィック インスタンス分析

    子类的方法的访问权限一定要大于等于父类的访问权限。

    Java オブジェクト指向ポリモーフィック インスタンス分析

    重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心将方法名字拼写错了 (比如写成eat), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写.

    Java オブジェクト指向ポリモーフィック インスタンス分析

    被static修饰的方法也不能被重写

    总结方法重写的注意事项:

    • 被private,final修饰的方法不能被重写。

    • 被staitc修饰的方法也不能被重写。

    • @override 可以检查你重写的方法名是否正确,最好要加上。

    • 方法重写一定满足方法名相同,参数列表相同,返回值相同。

    对比方法重写与方法重载:

    Java オブジェクト指向ポリモーフィック インスタンス分析

    最后:重写不是进行在原来基础的修改,而是在原来基础上进行迭代和更新。

    进一步认识和理解多态

    场景:画一个图形

    class Shape{//创建一个图形类---->作为多种图形的父类
        public int length;//图形的长
        public int wide;//图形的宽
        public int height;//图形的高
        public void draw() {
            System.out.println("我要画一个图形!!!");
        }
    }
    class rectangle extends Shape{//长方形
        @Override
        public void draw() {
            System.out.println("我要画一个长方形!!!");
        }
    }
    class square extends Shape{
        @Override
        public void draw() {
            System.out.println("我要画一个正方形!!!");
        }
    }
    class circular extends Shape{
        @Override
        public void draw() {
            System.out.println("我要画一个圆形!!!");
        }
    }
    public class TestDemo1 {
        public static void method(Shape shape) {
            shape.draw();
        }
        public static void main(String[] args) {
            Shape shape1 = new circular();
            Shape shape2 = new rectangle();
            Shape shape3 = new square();
            method(shape1);
            method(shape2);
            method(shape3);
        }
    }
    ログイン後にコピー

    创建一个Shape(父类),然后创建三个子类分别是square ,circular,rectangle,利用父类引用这三个子类,接着调用method方法。

    Java オブジェクト指向ポリモーフィック インスタンス分析

    这就是多态,不同的对象,调用同一个方法最后结果产生出不同的状态。

    我们再来总结多态产生的条件:

    • 要在继承体系下

    • 子类要对父类的方法进行重写

    • 通过父类的引用调用重写的方法 

    也就是 在继承体系下  进行向上转型  和 方法重写

    多态的优点

    优点:

    • 能够降低代码的 "圈复杂度", 避免使用大量的 if - else

    • 如果使用多态, 则不必写这么多的 if - else 分支语句, 代码更简单.

    • 可扩展能力更强

    缺点:

    • 代码的运行效率降低

    还有一个重要点就是不要在构造方法中调用重写方法

    以上がJava オブジェクト指向ポリモーフィック インスタンス分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

    Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

    ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

    Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

    Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

    Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

    Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

    この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

    Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

    Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

    Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

    Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

    カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

    カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

    Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Feb 07, 2025 pm 12:11 PM

    Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。

    See all articles