Java多形部分は上に転換し、下に転換する。
2845 ワード
(多態)モデルチェンジ問題は複雑ではありません。一言を覚えておけば、親はサブオブジェクトを参照します。親類とは、子の対象を指すもので、ゆっくり話を聞いてください。2つの名詞から、上への転換、下への転換というものです。
例えば、2つのクラスがあります。Fatherは父類で、Son類はFatherから継承されます。
実例アップコンバート:サブクラス参照の対象を親タイプに変換することをアップコンバートという。通俗的に言えば、子供を父親の対象にすることです。ここでは親オブジェクトはインターフェース とすることができます。上へ転換する時、親が子類を指す引用対象は親類と共有する他の方法をなくします。つまり、モデルチェンジの過程で、子類の新しい方法が失われます。コンパイルする時、システムは見つけられないエラーを提供します。
下への転換:親引用の対象がサブタイプに変換されることを下への転換といいます。
親類
下への転換過程では、2つの状況に分けられます。
ケース1:親引用の対象が、参照がサブクラスの対象である場合は、下方向への転換の過程で安全である。つまりコンパイルは間違いないです。
場合2:親の参照の対象が親自身である場合、下のモデルチェンジの過程では安全ではないので、コンパイルは間違いないですが、運行時にはjava.lang.CastExceptionエラーが発生します。これはinstance ofを使ってエラーを避けることができます。 安全は間違えません。 コンパイラエラー
例えば、2つのクラスがあります。Fatherは父類で、Son類はFatherから継承されます。
Father f1 = new Son(); // upcasting ( )
// f1 Son
Son s1 = (Son)f1; // downcasting ( )
// f1 Son
第2の例:Father f2 = new Father();
Son s2 = (Son)f2; // ,
第1例:Son s 1=(Son)f 1;何が正しいですか?簡単です。f 1はサブクラスのオブジェクトを指しますので、Father f 1=new Son()サブクラスs 1はもちろん、サブクラスのオブジェクトを参照することができます。f 2は、Fatherオブジェクト、Father f 2=new Father()に渡される。サブクラスs 1は、親オブジェクトを参照することができません。実例
下への転換:親引用の対象がサブタイプに変換されることを下への転換といいます。
親類
package testP.test;
class Person {
public void eat(){
System.out.println("Person eatting...");
}
public void sleep() {
System.out.println("Person sleep...");
}
}
アップコンバート
package testP.test;
public class son extends Person {
public void eat() {
System.out.println("son eatting...");
}
public void fly() {
System.out.println("son fly...");
}
public static void main(String[] args) {
Person person = new son();
person.eat(); // son eat ,son Person
person.sleep(); // person
person.fly(); // , son fly
}
}
下へ変換下への転換過程では、2つの状況に分けられます。
ケース1:親引用の対象が、参照がサブクラスの対象である場合は、下方向への転換の過程で安全である。つまりコンパイルは間違いないです。
場合2:親の参照の対象が親自身である場合、下のモデルチェンジの過程では安全ではないので、コンパイルは間違いないですが、運行時にはjava.lang.CastExceptionエラーが発生します。これはinstance ofを使ってエラーを避けることができます。
package testP.test;
public class son extends Person {
public void eat() {
System.out.println("son eatting...");
}
public void fly() {
System.out.println("son fly...");
}
public static void main(String[] args) {
Person person = new son(); //
son s = (son)person; // ,
s.fly();
s.eat();
s.sleep();
}
}
package testP.test;
public class son extends Person {
public void eat() {
System.out.println("son eatting...");
}
public void fly() {
System.out.println("son fly...");
}
public static void main(String[] args) {
Person upPerson = new Person();
son so = (son)upPerson; //
so.fly();
}
}
http://blog.sina.com.cn/s/blog_81547 cad 010115 o 4 t.