Javaマルチステート難点解析

17005 ワード

Javaマルチステート
定義:異なるクラスのオブジェクトが同じメッセージに応答することを許可します.すなわち、同じメッセージは、送信オブジェクトによって異なる動作方式を採用することができる.
例:一つの物事の多様な形態
  • ヒト動物生物:ヒトは動物であり生物である.
  • 牡丹=植物=生物:牡丹は植物であり生物でもある.

  • マルチステートのいくつかの重要な条件:
  • 相続関係が必要です.
  • 継承完了と同時に親への書き換え(書き換えとリロードの違いは私の「javaオブジェクト向け、メモリ、カプセル化、変数、リロードとリロード解説」というブログでも紹介されていますので、興味があれば聞いてみてください.
  • 親クラスのガイド変数が子クラスのオブジェクトを指す(これはjavaのマルチステートがコードに現れるものである).
  • 注意:ここでいう親は直接的な親であっても間接的な親であってもよい.

  • ここではもっと知識を挿入します.
  • プログラム実行は、プリコンパイル、コンパイル、実行の3段階に分けられる.
  • プリコンパイル:プログラムが開いた時点で、仕事は終わっている(プリコンパイルコマンド、#define)
  • コンパイル:プログラムを開いてから左上の三角形をクリックするまで–「=」の前の参照タイプしか認識できず、「=」の後ろのオブジェクトは認識されない.
  • 運転:三角形をクリックしてから-真の識別対象であり、対象が作業を開始する.注意:多態系の下で親と子が同じ属性を定義した場合、属性と方法の値の判断に有利である.
  • メンバー変数:コンパイル時に親を見ることができるか、実行時に親を見ることができるか.
  • メンバーメソッド:コンパイル時に親を見、実行時に子を見る.
  • 静的方法:コンパイル実行は親による.


  • マルチステートを使用する方法:
  • 子の親継承方式:
  • 	class Animal2 {
    		String name;
    		public Animal2() {
    			super();
    			// TODO Auto-generated constructor stub
    		}
    		public Animal2(String name) {
    			super();
    			this.name = name;
    		}
    		public void eat() {
    			// TODO Auto-generated method stub
    			System.out.println("animal-eat");
    		}
    	}
    	class Dog2 extends Animal2 {//       
    		public void eat() {
    			System.out.println("Dog-eat");
    		}
    		
    		public void bark() {
    			System.out.println("Dog-bark");
    		}
    	}
    	
    	class Cat2 extends Animal2 {//       
    		public void eat() {
    			System.out.println("Cat-eat");
    		}
    	}
    	public static void main(String[] args) {
    		
    		//    
    		//             --   java          
    		//  :                        。
    		
    		Anima2 dog2 = new Dog2();
    		dog2.eat();//    Animal       Dog  ,Dog     show  
    					//       :              ,     ,        Animal    。
    	}
    
  • インターフェースの実現方法:
  • 	interface Animal {
    		void eat();
    	}
    	class Dog implements Animal {//   Animal  
    		public Dog() {
    			super();
    			// TODO Auto-generated constructor stub
    		}
    		
    		public void eat() {
    			System.out.println("Dog-eat");
    		}
    	}
    	public static void main(String[] args) {
    		//    
    		Anima dog = new Dog();
    	}
    
  • 抽象クラス継承方式:インタフェースに類似する方式
  • マルチステートを使用する利点:
  • 代替性(substitutability):既存のコードに対してマルチステートが代替性を持つ.
  • 拡張性(extensibility):マルチステートはコードに拡張性を有し、既存のクラスのマルチステート性、継承性、その他の特性の運転や操作に影響を及ぼさない新しいサブクラスを追加する.
  • インターフェース性(interface-ability):マルチステートはメソッド署名によりサブクラスに共通のインターフェースを提供し、サブクラスによってそれを補完または上書きして実現される.
  • 柔軟性(flexibility):アプリケーションにおいて柔軟で多様な操作を体現し、使用効率を向上させる.
  • 簡略化(simplicity):アプリケーションソフトウェアのコード作成と修正プロセスを多態簡略化し、特に多数のオブジェクトの演算と操作を処理する際に、この特徴が特に際立って重要である.
  • マルチステートの2つの重要なポイント:
  • 前提:必ず多態下.
  • 2点:
  • アップシフト:自定シフトに相当し、地タイプから高タイプへ.
  • 定義:子タイプを親参照に変換する.
  • 注意:引用タイプを変換するだけで、=後は関係ありません.
  • ダウンシフト:強制タイプ変換に相当し、高タイプから低タイプがある.
  • 定義:親の参照強制タイプを子の参照に変換-子クラス特有のメソッドを呼び出す.

  • 注意:
  • 変換は参照がクラスではなく、子クラスの参照で親クラスのオブジェクトを指そうとしない.
  • 多態でない場合は上向き・下向き転換は存在しない.

  • instanceof演算子:
  • 定義:全面的なオブジェクトが後のクラスまたはサブクラスのオブジェクトであるかどうかを確定し、trueを返し、falseを返していない.
  • 前と後は引き継がなければならず、なければすぐに間違いを報告する
  • 一部インスタンスコード:
  • 	public class Demo9 {
    		public static void main(String[] args) {
    			Animal3 dog3 = new Dog3();
    			Animal3 cat3 = new Cat3();
    			feedAnimal(dog3);
    		}
    		
    		public static void feedAnimal(Animal3 animal) {
    			/*animal.eat();*/
    			//       
    			if(animal instanceof Dog3) {
    				Dog3 dog3 = (Dog3) animal;
    				dog3.bark();
    			}
    		}
    	}
    	class Animal3 {
    		String name;
    		public Animal3() {
    			super();
    			// TODO Auto-generated constructor stub
    		}
    		public Animal3(String name) {
    			super();
    			this.name = name;
    		}
    		public void eat() {
    			// TODO Auto-generated method stub
    			System.out.println("animal-eat");
    		}
    	}
    	class Dog3 extends Animal3 {
    		public void eat() {
    			System.out.println("Dog-eat");
    		}
    		public void bark() {
    			System.out.println("Dog-bark");
    		}
    	}
    	class Cat3 extends Animal3 {
    		public void eat() {
    			System.out.println("Cat-eat");
    		}
    	}
    

    まとめ:
    JAvaのオブジェクト向けの3つの特性:パッケージ、継承、マルチステート.一定の角度から見ると、パッケージと継承はほとんどマルチステートのために準備されており、マルチステートはjava全体の学習に貫かれており、マルチステートはテレビを白黒からカラー時代に持ち込んだようなものである.