Java多形部分は上に転換し、下に転換する。

2845 ワード

(多態)モデルチェンジ問題は複雑ではありません。一言を覚えておけば、親はサブオブジェクトを参照します。親類とは、子の対象を指すもので、ゆっくり話を聞いてください。2つの名詞から、上への転換、下への転換というものです。
例えば、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.