Java継承アプリケーションのまとめ


私の瞬间记忆症候群はあまりにも深刻で、いつも最初の日に覚えたものを理解して翌日忘れて、忘れた后にまた最初の日の学习の过程を缲り返して、本当に时间を浪费します.例えばJavaの子類の父類のこのような簡単なもの、私はすでに覚えて、忘れて、覚えて、忘れた循環はいくつかの輪廻を知らないで、時間を節約するために、私はやはり総括して、記録を加えたほうがいいと思って、あれらの私の記憶を混同するスープの水を取り除いて、ただ乾物だけを残します.
 
    継承の概念はくどくどしないで、直接応用を言います.
 
 
1.親がカスタムコンストラクタを持っているが、参照しないコンストラクタを定義していない場合は、サブクラスも必ずconstructorをカスタマイズする必要があります.そうしないと、サブクラスはImplicit super constructor SuperClass()is undefined for default constructor.Must define an explicit constructorに報告されます.(子クラスは親クラスの非パラメトリックコンストラクション関数を自動的に呼び出すが、この関数は存在しないため、エラーが報告されます).カスタムコンストラクション関数のパラメータは親とは異なります.
 
2、サブクラスカスタムコンストラクション関数の最初の行は、明示的に親を呼び出すコンストラクション関数を初期化し、明示的に呼び出さないと、子コンストラクション関数は親のデフォルトコンストラクション関数(すなわち、コンストラクション関数なし)を呼び出します.この場合、親にコンストラクション関数がない場合は、Implicit super constructor SuperClass()と報告されます. is undefined. Must explicitly invoke another constructor.
 
3、サブクラスは親のprivateデータを直接使用して読み取ることはできません.親が提供するpublic accessメソッド、すなわちgetterとsetterを使用します.
 
4、子クラスが親クラスのmethodを書き換えた場合、子クラスが親クラスを呼び出すメソッドはsuper.someMethod()の形式で呼び出さなければなりません.そうしないと、実行時にjava.lang.StackOverflowErrorがエラーとして報告されます(システムが繰り返し呼び出されるのは子クラスの書き換えメソッドであり、デッドサイクルをもたらすためです).
 
5、書き換えの意味は、戻り値タイプ、メソッド名、パラメータタイプと個数が同じである(戻り値タイプはSE 5.0でも異なる場合がある).
 
6、子クラスが親クラスを書き換える方法、子クラスの方法は親クラスの方法の役割ドメインを下げることができなくて、例えば:親クラスのある方法の役割ドメインはprotectedで、それでは複写方法はfriendlyとprivateではなくて、protectedあるいはpublicしかありません.
 
 
7、サブクラスオブジェクトを親タイプ変数、すなわちSuperClass e=new SubClass()に割り当てることができ、逆にできない. しかし、コンパイラは、eがSuperClassタイプに属するだけであるため、SubClassの固有のメンバーおよびメソッド(書き換えのメソッドではなく新しいメソッド)を呼び出すことはできないが、書き換えられたメソッドを呼び出すことができ、動的バインドのため、eが呼び出すメソッドはサブクラスのメソッドロジックに従って実行される.
 
8、子クラスは親クラスのprivateメソッドを上書きできません.コンパイルは通過できますが、実際には上書きは成功せず、新しいメソッドが生成されただけです.次のコードを参照してください.
class BaseClass {
   private void g() {
      System.out.println("BaseClass.g()");
   }
} 


class DeriveClass extends BaseClass {
   public void g() {
     System.out.println("DeriveClass.g()");
   }

}

public class Test {
    public static void main(String[] args) {
        BaseClass p = new DeriveClass();
        //p.g();   you can't call  the method, because g() is not overriden but new added method.

    }

}

 
9、あるクラスの継承を禁止したい場合は、このクラスをfinal classと定義することができます.この場合、クラス内のすべてのメソッドは自動的にfinal型に設定されます.あるメソッドの書き換えだけを禁止する場合は、メソッドのみをfinalと定義することができます.私たちが普段使っている腐ったStringクラスはfinal型なので、このクラスを継承できません. 
 
 
10、Javaプログラミングでは、あるタイプのオブジェクトを別のタイプに変換することができ、この変換プロセスを「転換(Casting)」と呼ぶ..このような転換はprimitive型データで発生してもよいし、オブジェクトで発生してもよい.オブジェクトで発生した場合、一定の要求がある.まず、互いに転換したオブジェクトは継承関係を持つべきである.そのため、以下のような転換はコンパイル時に誤りである.
Employee e = new Employee(); // Employee Date      
Date c = (Date) e;

  
   モデルチェンジには2つあります.上へのモデルチェンジと下へのモデルチェンジです.
   アップシフト(Upcasting):まず次のコードを見てください.
class Instrument {
  public void play() {}
  public static void tune(Instrument i) {
    i.play();
  }
}

class Wind extends Instrument {
  public static void main(String[] args) {
    Wind flute = new Wind();
    Instrument.tune(flute);  //upcasting
  }
}

    このコードでは、Instrumentクラスのtuneメソッドは本来、Instrumentタイプの参照を受け入れていますが、Wind.main()関数がtuneを呼び出すと、Windタイプの参照が入力されます.コンパイラは依然として受け入れることができます.この間、「サブクラスの参照を親参照に変換」という変換が明らかに発生しました.この変換を「アップシフト」と呼びます..アップコンバートを行う場合、特殊なタイプを汎用タイプに変換するため、classインタフェースに与える唯一の効果は「新規」ではなく「減少」であるため、「アップコンバート」は安全であり、特別な声明を必要とせずに行うことができると考えています.例を挙げると、富豪が自発的に普通の人になりたいのは明らかに「安全」です.しかし、逆に、普通の人が一気に富豪の特権を持ちたいと思っているのは容易ではなく、資格審査を経なければならない.......
    上のレビューが必要なのは、親から子への変換という「ダウンシフト」(downcasting)です.コードを見てみましょう.
Instrument gitar = new Instrument(); 
Instrument flute = new Wind();

Instrument i = flute;  // compiling error, Type mismatch: cannot convert from SuperClass to SubClass
Instrument i = (Wind)flute;   // pass
Instrument i = (Wind)gitar ;  // runtime error, ClassCastException

    上記の例から、Javaコンパイラと仮想マシンは「ダウンシフト」の監査に厳しいことがわかります.「(SubClassName)」のタグを追加するだけでなく、モデルチェンジされた親参照が「資格がある」ことを保証します.トランスフォーム.つまり、子を指す親参照が指定されている場合にのみ、前の例のflute参照のように子クラスに変換できますが、gitar参照は明らかに一致しません.オブジェクト参照がターゲットタイプに変換されたかどうかを「instanceof」で判断することもできます.
実際のプロジェクト応用では、「アップシフト」と「ダウンシフト」の応用が広く、CollectionからListへの転換が多い.
 
11、抽象クラスはインスタンス化できませんが、変数を定義するために使用できますが、変数はそれを継承する非抽象サブクラスインスタンスを指します.