親クラスAnimalを定義します。コードは次のとおりです。
public class Animal {
public void sleep() {
System.out.println("小动物在睡觉");
}
public static void doSleep(Animal animal) {
// 此时的参数是父类对象,但是实际调用时传递的是子类对象,就是向上转型。
animal.sleep();
}
public static void main(String[] args) {
Animal animal = new Animal();
animal.doSleep(new Cat());
animal.doSleep(new Dog());
}
}
public class Cat extends Animal {
@Override
public void sleep() {
System.out.println("猫正在睡觉");
}
}
public class Dog extends Animal {
@Override
public void sleep() {
System.out.println("狗正在睡觉");
}
}
アップキャストする必要がない場合は、2つのdoSleepメソッドを作成する必要があります。1つはCatクラスオブジェクトを渡すためのもので、もう1つはDogクラスオブジェクトを渡すためのものです。これらはまだ2つのサブカテゴリです。複数のサブカテゴリがある場合は、同じメソッドを多数作成する必要があり、重複が発生します。上向きの変換は、クラスのポリモーフィズムをより適切に反映し、プログラムの間接性を強化し、コードのスケーラビリティを向上させることがわかります。サブクラスの一意のメソッドを使用する必要がある場合は、ダウンキャストできます。そのため、ダウンキャストする必要があります。
次のように要約します。
- サブクラスオブジェクトを親クラス参照に直接割り当てることは上向きの変換であり、上向きの変換は自動的に変換されます。父父=新しい息子();など。
- サブクラスオブジェクトを指す親クラス参照のサブクラス参照への割り当てはダウンキャストであり、キャストする必要があります。ダウンキャストを使用するには、最初にキャストアップする必要があります。安全のために、instanceof演算子を使用して判断できます。父がサブクラスオブジェクトを指す親クラス参照である場合、父をサブクラス参照息子に割り当てます
Son son =(Son)father;
。(Son)
強制改宗のためには、父親の前にあるものを追加する必要があります。 - アップキャストでは、サブクラスの一意のプロパティとメソッドを使用できず、親クラスのプロパティとメソッドのみを参照できますが、サブクラスが親クラスをオーバーライドすることは効果的です。
- アップキャスト時には、例1で呼び出されたsleepメソッドなど、サブクラスの親クラスをオーバーライドするメソッドが最初に使用されます。
- アップキャストの効果は、反復するコードを減らすことです。親クラスをパラメーターとして使用すると、コードが簡潔になり、ポリモーフィズムがより適切に反映されます。