関連学習の推奨事項: java 基礎チュートリアル
今日、私はいつものように会社を訪問しました。ワークステーションに座ってコンピューターの電源を入れます。「今日もレンガを動かす日です」
。考えた後、手際よくIdeaを開いて今日の要件を見てコーディングを開始しました。ねえ、これらのコードは誰が書いたのでしょうか。なぜそれらが私のコードに表示されるのですか。そして、まだ提出を待っているのです。私はこれらのコードを書いたことがないことを覚えているので、興味深くそれらを眺めました:
後ろから音が出ました。出力のことを考えていたので、音の発生源は気にしていませんでした。コードを見た後、
polygon() before cal() square.cal(), border = 2 polygon() after cal() square.square(), border = 4复制代码
という結論に達しました。少なくとも、あなたは Java 開発エンジニアですよね? 普段はたくさんの仕事をしていますが、それでもいくつかの基本的なスキルは持っています。ちょっと誇らしく感じずにはいられませんでした~
「これが答えですか?あなたも調子が悪そうですね」また突然声が響いた、今度はもう冷静ではありませんでした、ニマ!私もこの答えを頭の中で考えました、わかりました?誰がそれを見ることができますか?さらに、人々は Awei の 18 スタイルのセットを演奏したくなります。
彼は疑いと怒りを込めて頭を振りました。なぜ誰もいないのですか?いかなる疑念も許せませんでした。 「シャオカイ、起きて、なぜ勤務時間中に眠ってしまったのですか?」
勤務時間中に眠ってしまいましたか?目を開けて周囲を見渡すと、それは夢だったことが分かり、安堵のため息をつきました。周りを見渡すと、目の前に部長が立っているんですが、勤務時間中寝てるんですが、体調不良か何かですか?昨日はたくさんのバグを書きましたが修正せず、今日はめちゃくちゃなものを提出しました。今月のあなたのパフォーマンスは私が望むものではないと思います。あなたのパフォーマンスに基づいて、部門のためにそれについて考え始めなければなりません。
この文を言う前に、心の中で感じた 花を持って帰りたい 本物でも偽物でも深夜のバーで 思う存分振って彼のことを忘れてください あなたが一番魅力的です目覚ましベルが鳴りました 立ち上がった背中は少し濡れていて額にはうっすらと汗ばんでいました 携帯を確認すると土曜日の8時半でした それは夢だったことが分かりました!
奇妙なことに、どうしてこんな奇妙な夢を見ることができるのでしょうか?とても怖いです。そこで夢の中でコードの一部を思い出したのですが、私の結果は間違っているでしょうか?記憶に基づいて、コンピュータで再度入力したところ、結果は次のようになります。
/* polygon() before cal() square.cal(), border = 0 polygon() after cal() square.square(), border = 4 */复制代码
square.cal()、border
の結果は、実際には 2 ではなく 0 です。今ではポリモーフィズムも苦手なのでしょうか?パソコンや携帯電話の前では、正解かどうかわかりません。持っている人も持っていない人も、Xiao Caiと一緒にポリモーフィズムを復習しましょう!友達の中には、
square.cal(), border
square.square(), border = ではないのかについて混乱している人もいるかもしれません。 4 まず疑問をアウトプットします。それでは、疑ってみましょう!
ポリモーフィズム
ポリモーフィズムは、コードの構成と読みやすさを向上させるだけでなく、スケーラブルなプログラムを作成することもできます。ポリモーフィズムの機能は、型間の 結合関係
を排除することです。1. 上方変換
オブジェクトは、独自の型または基本型として使用できます。オブジェクトへの参照をその基本型への参照として扱うこのメソッドは、
Upcast
上方変換と呼ばれます。
public class Animal { void eat() { System.out.println("Animal eat()"); } }class Monkey extends Animal { void eat() { System.out.println(" Monkey eat()"); } }class test { public static void start(Animal animal) { animal.eat(); } public static void main(String[] args) { Monkey monkey = new Monkey(); start(monkey); } }/* OUTPUT: Monkey eat() */复制代码
上記の
test クラスの start() メソッドは
Animal への参照を受け取りますが、当然のことながら
から受け取ることもできます。 Animal のエクスポートされたクラス。
eat() メソッドを呼び出す場合、
Monkey で定義された
eat() メソッドが型変換なしで自然に使用されます。
Monkey から
Animal にアップグレードすると、インターフェイスの数が減るだけで、インターフェイスの数が
Animal よりも減るわけではないためです。
特に適切ではない例え:
あなたの父親の財産はあなたに相続され、あなたの財産は依然としてあなたのものです。一般的に、あなたの財産はあなたの父親の財産を下回ることはありません。
在 test.start()
方法中,定义传入的是 Animal
的引用,但是却传入Monkey
,这看起来似乎忘记了Monkey
的对象类型,那么为什么不直接把test
类中的方法定义为void start(Monkey monkey)
,这样看上去难道不会更直观吗。
直观也许是它的优点,但是就会带来其他问题:Animal
不止只有一个Monkey
的导出类,这个时候来了个pig
,那么是不是就要再定义个方法为void start(Monkey monkey)
,重载用得挺溜嘛小伙子,但是未免太麻烦了。懒惰才是开发人员的天性。
因此这样就有了多态
的产生
方法调用中分为 静态绑定
和动态绑定
。何为绑定:将一个方法调用同一个方法主体关联起来被称作绑定。
静态绑定
:又称为前期绑定。是在程序执行前进行把绑定。我们平时听到"静态"的时候,不难免想到static
关键字,被static
关键字修饰后的变量成为静态变量,这种变量就是在程序执行前初始化的。前期绑定
是面向过程语言中默认的绑定方式,例如 C 语言只有一种方法调用,那就是前期绑定。引出思考:
public static void start(Animal animal) { animal.eat(); }复制代码
在start()
方法中传入的是Animal
的对象引用,如果有多个Animal
的导出类,那么执行eat()
方法的时候如何知道调用哪个方法。如果通过前期绑定
那么是无法实现的。因此就有了后期绑定
。
动态绑定
:又称为后期绑定
。是在程序运行时根据对象类型进行绑定的,因此又可以称为运行时绑定
。而 Java 就是根据它自己的后期绑定机制,以便在运行时能够判断对象的类型,从而调用正确的方法。小结:
Java 中除了 static
和 final
修饰的方法之外,都是属于后期绑定
显然通过动态绑定
来实现多态
是合理的。这样子我们在开发接口的时候只需要传入 基类 的引用,从而这些代码对所有 基类 的 导出类 都可以正确的运行。
其中Monkey
、Pig
、Dog
皆是Animal
的导出类
Animal animal = new Monkey()
看上去不正确的赋值,但是上通过继承,Monkey
就是一种Animal
,如果我们调用animal.eat()
方法,不了解多态的小伙伴常常会误以为调用的是Animal
的eat()
方法,但是最终却是调用了Monkey
自己的eat()
方法。
Animal
作为基类,它的作用就是为导出类建立公用接口。所有从Animal
继承出去的导出类都可以有自己独特的实现行为。
有了多态机制,我们可以根据自己的需求对系统添加任意多的新类型,而不需要重载void start(Animal animal)
方法。
在一个设计良好的OOP程序中,大多数或者所有方法都会遵循start()
方法的模型,只与基类接口同行,这样的程序就是具有可扩展性的,我们可以通过从通用的基类继承出新的数据类型,从而添加一些功能,那些操纵基类接口的方法就不需要任何改动就可以应用于新类。
我们先来复习一下权限修饰符:
スコープ | 現在のクラス | パッケージを使用する | 子孫クラス | その他のパッケージ |
---|---|---|---|---|
公開 | √ | √ | √ | √ |
保護済み | √ | √ | √ | × |
デフォルト | ##√√ | × | ||
√ | ×############################################## |
以上が最近では、Java を知っていると言うなら、ポリモーフィズムを知らなければなりません。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。