CoreJava学習ノート4

8108 ワード

オブジェクト向けの3つの特徴:カプセル化、継承、マルチステート
Javaのパッケージ
パッケージは、オブジェクトと外部とのつながりが統一されたインタフェースを通過しなければならない.
対象の内容は公開すべきで、隠すべきである.(オブジェクトのプロパティは非表示にする必要があります)
1つのオブジェクトの内部は透明で、オブジェクトの内部の透明性と非表示の特性を区別し、透明で透明で、非表示の非表示です.
プロパティのカプセル化、javaのクラスのプロパティのデフォルトアクセス権はprivateではなくdefaultであり、アクセス権修飾子を付けないプロパティとメソッドのデフォルトはdefaultです.
このプロパティまたはメソッドを非表示にします.private(プライベート)修飾子を付けるには、クラス内でのみアクセスできるように制限します.プロパティは一般的にプライベートprivateとして作成されます.
クラス内のプライベート属性については、ペアのメソッド(getXxx()、setXxx()を指定してプライベート属性にアクセスし、プライベート属性の操作のセキュリティを保証します.
方法のカプセル化、方法のカプセル化に対して、この公開の公開、この隠蔽の隠蔽.メソッドは、(パラメータと戻り値を知るだけでメソッドを呼び出すことができる)メソッドの宣言(定義)を開示し、メソッドのインプリメンテーションを非表示にすると、インプリメンテーションの変更がアーキテクチャに与える影響を最小限に抑えることができます.
パッケージの意味では、パッケージは、メソッドの実装の変更がアーキテクチャに与える影響を最小限に抑えることができます.
完全にカプセル化され、クラスのプロパティはすべてプライベート化され、プロパティにアクセスするための一対の方法が提供されます.
例:
public class Person{
	private int age;//     
	private String name;
	public String getName(){
		return name;
	}
	public void setName(String name){
        this.name=name; //this      ,         
         //               name                   
    }
	public int getAge(){//     
		return age;
}
private String nickname(){//     
	……
}
public void setAge(int age){
	this.age=age
}

}

JAvaでの継承
継承は、共通の特性を持つ複数の物事を、さらに抽象的に一つのクラスにすることである.このクラスは多種類の物事の親です.親の意味は、複数の物事の共通性を抽出できることです.
JAvaでの継承はextendsキーワードを使用します.javaでは単一の継承のみが許可され、1つのクラスには1つの親しかありません.
このように継承関係は木状でjavaの単純性を体現している.
子クラスは、親クラスでアクセスできる属性とメソッドのみを継承できます(親クラスのプライベート属性とメソッドは継承されますが、子クラスではアクセスできません).
アクセス制御修飾子:(属性とメソッドを修飾できます)
private修飾子は、本クラスの内部のみがアクセスできることを示します.
default修飾子、メソッドは修飾子を付けず、デフォルトはdefaultで、同じパッケージでアクセスできることを示し、親子クラスは同じパッケージで、子クラスは親クラスの対応する内容を継承することができます.(修飾可能クラス)
protected(保護)修飾子は、同じパケットにアクセスできることを示し、異なるパケットのサブクラスにも継承にアクセスできることを示します.
public修飾子は、公開を表し、どこでもアクセスできます.(修飾可能クラス)
修飾子の権限は上から下へ徐々に広くなります.
継承の意味は、子クラスが親クラスの基礎の上で親クラスの機能を発展させることができ、継承はシステムの結合性を低下させ、オブジェクト間のつながりを緩やかにし、多種類のオブジェクト間のつながりをその親オブジェクトに置き換えることができる.
注意:構造方法は継承できません.
親クラスの属性およびメソッドの決定:子クラスの観点から子クラス間の共通性を見て、すべての子クラスがこの属性を持っている場合、親クラスに置くべきかどうかを考慮する必要があります.
メソッドはオブジェクトの動作と見なすことができ、クラスのメソッドはこのクラスのオブジェクトが共有する動作であるため、メソッドの決定時に、すべてのサブタイプにこのメソッドが必要かどうかに注意し、異なるサブタイプのこのメソッドによって、このメソッドを上書きする.
JAvaでのメソッドの上書き
子クラスには、親クラスから継承されたメソッドを上書きする、親クラスからアクセス可能(子クラスに継承可能)と同じ名前、同じ戻り値タイプ、同じパラメータテーブルのメソッドがあります.
注意:親のメソッドを上書きします.子に書かれたメソッドは、親のメソッド名、パラメータテーブル、戻り値タイプと同じで、親のメソッドよりも権限アクセス修飾子の方が権限修飾子の方が同じか広いかのいずれかです.
注意:jdk 1.4以前にメソッドの上書きを要求する場合、メソッドの戻り値、パラメータテーブル、メソッド名は厳密に同じである必要があり、jdk 1.5でメソッドが上書きされ、サブクラスで上書きされたメソッドの戻り値は、親クラスで上書きされたメソッドの戻り値タイプのサブタイプであってもよい.
注意:子が親を上書きするメソッドでは、メソッドの修飾子が同じか、子のメソッドの修飾子が親よりもアクセス権が広いことを示します.親クラスのプライベートメソッドは、子クラスに継承されず、子クラスで上書きしても多態ではありません.
上書きの意味:親から継承するメソッドの発展.
注意:親子クラスには、子クラスが親クラスのプロパティを上書きしない同名のプロパティがあります.この場合、プロパティの上書き(shadow)として使用されます.
例:
public class Person{
	……
	private int age;
	public void study(){
		System.out.println(“  ”);
	}
}
class Child extends Person{
	private int age;//     
	public void study(){//       study()  
		System.out.println(“     ”);
	}
}
public class Test{
	static public void main(String[] args){
		Person p=new Child();
		p.study();
	}
}

継承関係のあるオブジェクトを作成するには
1,再帰的な構造親のオブジェクト
2、スペースの割り当て
3,本クラスのインスタンス変数(属性)を初期化する
4,本クラスの構築方法を呼び出す
注:子オブジェクトには親オブジェクトが含まれています.親オブジェクトに子オブジェクトが追加されている場合は、完全な子オブジェクトのインスタンスです.サブクラスオブジェクトを構築する場合、再帰的に構築された親オブジェクトは、親クラスの無パラメータの構築方法をデフォルトで呼び出すので、クラス内の無パラメータの構築方法を書いたほうがいいです.
superキーワード
super()は、サブクラスの構築方法で親を呼び出す構築方法(サブクラスの構築方法で親の属性を初期化できる)を表し、super()は構築方法の最初の文にのみ表示されます.super()は、子クラスのコンストラクタで親クラスを構築するときにどの親クラスの構築方法を呼び出して親クラスを構築するかを指定します.
superは、親クラスのオブジェクトを表し、superによって親クラスでアクセス可能なメソッド(親クラスでsetXxx()を定義でき、getXxx()メソッドによって親クラスのプライベート属性にアクセスできます)を使用し、superは親クラスで同名の属性の命名競合をブロックできます.
例:
public class Person{
	……
	private int age;
	private String name;
	public Person(){
	}
	public Person(String name){
		this.name=name;
    }
	public void study(){
		System.out.println(“  ”);
	}
}
class Child extends Person{
	private int age;//     
	public Child(String name){
		spuer(name);//                 
	}
public void study(){//       study()  
		System.out.println(spuer.getName()+“     ”);
        //super.getName()           
	}
}

  :           this(),   super() ,                 ,     super(),      ,           。

     :               ,             ,               

java    (              )

  ,                  ,              。

  ,     (     )
           (  )

     ,           ,    。
     ,             ,      (           )

      ,              ,               。
          ,          。
                                。

     
1,           (      )
2,               。
3,                        。

     :             ,               。

  :          ,          。
          ,                         。
             。
       ,                  。

instanceof,                 

 
public class Animal{
	……
	public void eat(){
		System.out.println(“eat sth”);
	}
	public static void main(String[] args){
		Animal a=new Dog();
		Animal b=new Cat();
		if(b instanceof Dog){
			Dog d=(Dog)b
		}
        /*
Animal      ,          ,  
       ,     ,       
*/
a.eat();
b.eat();
	}
}
class Dog extends Animal{
	public void eat(){
		System.out.println(“eat bones”);
	}
}
class Cat extends Animal{
	public void eat(){
		System.out.println(“eat fishs”);
	}
}

  :
eat bones
eat fishs

//ここでサブクラスのメソッドの結果を示すのは、マルチステートのため、その実際のタイプに基づいてサブクラスのメソッドを呼び出すためです
例:
2つのコード多重化
ホワイトボックス多重化、継承多重化、親クラスの布団クラスにアクセスできるものは継承され、不要な内容が継承される場合がありますが、この方法はあまりよくありません.
ブラックボックス多重化,組合せ多重化,多重化するコードのクラスのオブジェクトを本クラスの属性とし,メソッドの委任により選択的多重化を実現し,メソッドの委任は本クラスのメソッド内部でそのクラスのオブジェクトを介して使用するメソッドを呼び出す.
注:継承多重化の代わりに、できるだけ組合せ多重化を使用します.
例:
public class Car(){
	……
}

class Benz{
	Car c=new Car();
	……
}

マルチステートの使用
マルチステートはパラメータに使用され、メソッドのパラメータに親クラスタイプが入力され、実行時に実際の実行時タイプに基づいてメソッドで対応する操作が行われます.
マルチステートは値を返すために使用され、メソッドの戻り値タイプでは実際に値を返す親タイプであり、戻り値を使用するときも実際のタイプに関心を持つ必要はありません.
マルチステートは、需要の変化に適応するためにコードをより汎用化します.親クラスで定義する方法は、子クラスで異なるインプリメンテーションで上書きし、親タイプのオブジェクト参照に対応する機能が必要な子クラスのオブジェクトインスタンスを割り当てることができます.
例:
public class TestCar{
	public static void main(String[] args){
	    CarFactory cf=new CarFactory();
		Car c1=cf.createCar(1);
		Car c2=cf.createCar(0);
		c1.run();
		c2.run();
        cf.testCar(c2);
		cf.testCar(c1);
}
}

public class CarFactory{
	public Car createCar(int a){//         
		if(a==1){
			return new BenzCar();
        }else {
            return new BMWCar();
}
	}
	public void testCar(Car c){//         
		c.test();
	}
}
class Car{
	public void run(){
	}
	public void test(){
	}
}

class BenzCar extends Car{
	public void run(){
		System.out.println(“BenzCar is running”);
}
public void test(){
	System.out.println(“BenzCar is much better”);
}
}

class BMWCar extends Car{
	public void run(){
		System.out.println(“BMW is running”);
	}
public void test(){
System.out.println(“what a buttiful BMWCar! ”);
}
}

  :
BenzCar is much better
BMW is running
what a buttiful BMWCar!
BenzCar is much better