移行の最大のJava多型
多型は、第三のオブジェクト指向機能です。
ポリモーフィックな利点
- コードの組織構造と可読性を向上させます。
- スケーラブルなプログラムを作成する機能。(あなたは、常に新しい機能を追加することができます)
- 型間の排除の結合関係。
正直に言うと、私は白、上記の3つの利点を理解することが少ないことと思います。さらなる研究により、より深い理解がある必要があり、私たちはお互いを奨励します。
アップキャスト
コンセプト
Javaは自動的に、システムを任意の強制変換をしない、親クラスの参照変数に割り当てられたクラスのオブジェクトハンドルを可能にします。継承のボトムアップ変換からアップ、サブクラスは親クラスを継承し、サブクラスは特殊な親クラスであるため、操作の上方遷移は、実際には合理的であるています。
次の簡単なコードに従い、上向きのリストラの概念とメリットを理解しようとします。
package com.my.pac14;
/**
* @auther Summerday
*/
public class DynamicBinding {
//Object是所有类的超类,根据向上转型,该方法可以接受任何类型的对象
public static void test(Object x) {
System.out.println(x.toString());
}
public static void main(String[] args) {
test(new PrimaryStudent());//Student
test(new Student());//Student
test(new Person());//Person
test(new Object());//java.lang.Object@1b6d3586
}
}
class Person extends Object {
@Override
public String toString() {
return "Person";
}
}
class Student extends Person {
@Override
public String toString() {
return "Student";
}
}
class PrimaryStudent extends Student {
}
- 私たちは、以下の方法で受け取ることがわかります
Object
オブジェクトの種類、および呼び出し元のオブジェクトtoString()
メソッドを。
public static void test(Object x) {
System.out.println(x.toString());
}
- ここでは4番目の文に加えて、他の着信オブジェクトは、パラメータの型と矛盾するようですが、もちろん、あなたは私たちが話している内部含まれ、実行することができ、呼び出し文で上向きに推移し。
public static void main(String[] args) {
test(new PrimaryStudent());//Student
test(new Student());//Student
test(new Person());//Person
test(new Object());//java.lang.Object@1b6d3586
}
- インスタンスのタイプの学生の入ってくるオブジェクトを取り、それを分解し、次式です:
Object x = new Student();
- オブジェクトクラスは、すべてのクラスのスーパークラスであり、サブクラス型のオブジェクト・タイプは直接上方遷移と呼ばれるJavaで許可されている親クラス参照型変数に割り当てる作成されます。その理由は、達成することができるだけでなく、上方への遷移の過程におけるサブクラスは、インターフェイスを減らす可能性があるため、しかし少なくともなく、いくつかの親クラス・インターフェースよりも狭いです。
ここでは簡単な例である、彼らは様々なたくさんのに分けることができると仮定し、我々は、と言うことができる学生はヒトであるが、人間は学生であると言うことはできません。形質転換はある程度サブクラス延長欠落しているスーパークラスの参照変数まで可能にするだけで達成するために、親クラスの親クラスのメソッドで呼び出すことができ、我々は、人間が唯一の動作プロパティを選択しなければならないとき、人間を操作する必要があります直接ではなく、標準のクラスの生徒に、我々は彼がそれの学生であった場合ではないようなものかわからないので、それを動作させるためにいくつかのものは、私は人間だから、あなたが学生のクラスを持っている必要があり、全ヒトの右に、右、 。これは私が理解してアップキャストです。
幸いなことに、どのようなアップキャスト
何の上方移行メカニズムが存在しない場合、我々はあなたが過負荷の数増やす必要があり、本来の効果を実現したいtest
ので、それはあまりにも面倒である、方法を。あなたが似て増やしたい場合test()
の方法をか追加しObject
、新たな派生クラスを、だけでなく、より複雑な操作を行うために、それは望ましくない望ましくない、拡大に資するものです。
// 原来的情况:需要创建很多很多的测试方法。
public static void test(Object x) {
System.out.println(x.toString());
}
public static void test(Person x) {
System.out.println(x.toString());
}
public static void test(Student x) {
System.out.println(x.toString());
}
public static void test(PrimaryStudent x) {
System.out.println(x.toString());
}
多型は、拡張を容易にするために、ちょうどこの困難な問題を解決するために存在し、単純なメソッドパラメータとして受信専用基底クラスを記述し、関係なく、実行時に派生クラスの派生クラスを自動的にメソッドの対応する選択と呼ばれ、実際、非常に快適。
だから、コンパイラは何と呼ばれるべき方法を決定する方法ですか?これは、これはそれをされ、それを「結合」は、いわゆる、我々は次の作品をまとめたものが含まれます。
参考図書:「Javaで考えます」