JAvaプログラミング思想ノート(五)類多重(コード多重)と多態

5185 ワード

詳細
1.コードの多重化方法:
 
(1)クラスの組合せ
噴水システムのように、水資源が必要である.
 
 class WaterSource {
private String s;
//   
WaterSource() {
System.out.println("WaterSource()");
s = new String("Constructed");
}

//    
public class SprinklerSystem {
 
WaterSource source = new WaterSorce();
}

実際には新しいクラスの中で多くの他のクラスを引用し、これらのクラスは低結合で、高再利用である.
 
 
(2)クラス継承
派生類は親類を継承し、派生類は親類の方法を使用することができ、また新しい方法を拡張することができる.(javaオブジェクト向けの3つの特性の1つ)
注意:
派生クラスのオブジェクトを作成すると、親クラスのサブオブジェクトが含まれます.このサブオブジェクトは、ベースクラス自体に基づいてオブジェクトを作成したようなものです.外部から見ると、ベースクラスのサブオブジェクトは派生クラスのオブジェクトにカプセル化されている.
したがって、親が上から下へ呼び出されるコンストラクタは、親が上にないまで呼び出されます.
派生クラスコンストラクタと親クラスコンストラクタの変数が異なると、エラーが報告される.解決策は、同じコンストラクタを作成するか、派生クラスでsuper(xx)で親クラスのコンストラクタに参照することです.
 
p r o t e c t e dキーワード
変数またはメソッドがprotectedキーワードを使用する場合、同じパッケージのクラスまたは継承によってのみ使用できます.
 
 
(3)組合せと継承を併用
 
class Plate {
Plate(int i) {
System.out.println("Plate constructor");
}
}
class DinnerPlate extends Plate {
DinnerPlate(int i) {
super(i);
System.out.println(
"DinnerPlate constructor");
}
}
class Utensil {
Utensil(int i) {
System.out.println("Utensil constructor");
}
}
class Spoon extends Utensil {
Spoon(int i) {
super(i);
System.out.println("Spoon constructor");
}
}
class Fork extends Utensil {
Fork(int i) {
super(i);
System.out.println("Fork constructor");
}
}
class Knife extends Utensil {
Knife(int i) {
super(i);
System.out.println("Knife constructor");
}
}
// A cultural way of doing something:
class Custom {
Custom(int i) {
System.out.println("Custom constructor");146
}
}
public class PlaceSetting extends Custom {
Spoon sp;
Fork frk;
Knife kn;
DinnerPlate pl;
PlaceSetting(int i) {
super(i + 1);
sp = new Spoon(i + 2);
frk = new Fork(i + 3);
kn = new Knife(i + 4);
pl = new DinnerPlate(i + 5);
System.out.println(
"PlaceSetting constructor");
}
public static void main(String[] args) {
PlaceSetting x = new PlaceSetting(9);
}
} ///:

 
 
2.finalキーワード使用
(1)final修飾変数
変数は定数に設定.staticフィールドでもfinalフィールドでも、データは1つしか保存できず、変更できません.
(2)final修飾方法
この方法は布団類で上書きして書き換えることはできない.
 
(3)final修飾クラス
クラスは継承できません.
 
finalメソッドを採用する第2の理由は,プログラム実行の効率である.1つのメソッドをfinalに設定すると、コンパイラはそのメソッドに対するすべての呼び出しを「埋め込み」呼び出しに入れることができます.コンパイラがfinalメソッド呼び出しを発見すると、(独自の判断に基づいて)メソッド呼び出しメカニズムを実行するために採用された従来のコード挿入メソッド(引数をスタックに押し込む;メソッドコードにジャンプして実行する;ジャンプバック;スタック引数をクリアする;戻り値を最も後に処理する)は無視されます.逆に、メソッド呼び出しは、メソッド本体内の実際のコードのコピーで置き換えられます.これにより、メソッド呼び出し時のシステムオーバーヘッドを回避できます.もちろん,メソッドのボリュームが大きすぎると,プログラムも雍腫になり,埋め込みコードによるパフォーマンスの向上を受けられない可能性がある.どんな昇進も方法の内部に費やされた時間で相殺されたからだ.Javaコンパイラは、これらの状況を自動的に検出し、finalメソッドを埋め込むかどうかを「賢明」に決定します.しかし、コンパイラがすべての判断を正確に下すとは信じないほうがいい.通常,メソッドのコード量が非常に少ない場合や,メソッドが上書きされることを明確に禁止したい場合にのみ,1つのメソッドをfinalに設定することを考慮すべきである.  
private修飾の方法はすべて自動的にfinalになるので、方法は私有です.
 
4.初期化順序の継承
昆虫と甲虫の例:
class Insect {
 int i = 9;
 int j;
 Insect() {
 prt("i = " + i + ", j = " + j);
 j = 39;
}
static int x1 =prt("static Insect.x1 initialized");
static int prt(String s) {
System.out.println(s);
return 47;
}
} 
public class Beetle extends Insect {
int k = prt("Beetle.k initialized");
Beetle() {
prt("k = " + k);
prt("j = " + j);
}
static int x2 =
prt("static Beetle.x2 initialized");
static int prt(String s) {
System.out.println(s);
return 63;
}
public static void main(String[] args) {
prt("Beetle constructor");
Beetle b = new Beetle();
}
} ///:~

 
このプログラムの出力は以下の通りである:static Insect.x initializedstatic Beetle.x initializedBeetle constructori = 9, j = 0Beetle.k initializedk = 63j = 39  
 
1親staticの変数を初めて認識し、親staticの方法を後にし、子staticの変数と方法を再認識する.
2親変数と子変数を再初期化する.
3親コンストラクタと子コンストラクタを再初期化する.
 
マルチステート
マルチステートとは?
実际の多态:果物、人、动物、果物は1つの大きい种类で、小さい种类はバナナ、スイカ、リンゴなどで、このような1种の大きい种类は多くの小さい种类を含んで多态と言います.
JAvaにおけるマルチステートの定義:異なるクラスのオブジェクトが同じメッセージに応答することを許可することを指す.すなわち、同じメッセージは、送信オブジェクトによって異なる動作方式を採用することができる.(メッセージの送信は関数呼び出しです)
例えば、インタフェースと実装クラスは、1つのインタフェースが複数の実装クラスを実装ことができ、各実装クラスが異なる機能を実現することができる.
 
マルチステートの詳細については、次の文書を参照してください.http://www.cnblogs.com/jack204/archive/2012/10/29/2745150.html
 
Javaのデフォルトオブジェクトリファレンスはすべて晩バインドで、staticとfinalタイプのリファレンスのみが早期バインドまたはコンパイル時にバインドされます.
 
マルチステートの利点は次のとおりです.
プログラムの拡張性が良く、サブクラスがいくら追加されてもベースクラスのインタフェースは変更されず、サブクラス対応メソッドで具体的な実装を提供するだけでよい.すなわち、プログラムが変化する部分とプログラムが変わらない部分を分離するということである.クラス間の結合を低減
 
注意:通常の方法でのみ、マルチステートを使用できます.フィールドおよび静的方法では、マルチステートメカニズムはありません.