*JAVA-多形性(多態性)(2)例2エラー


参照変数とインスタンスの関連付け


親クラスと子クラスでメンバー変数を繰り返し定義します.
  • 祖先タイプの参照変数を使用する場合、祖先クラスで宣言されたメンバー変数、
  • が使用されます.
  • サブタイプの参照変数を使用する場合、サブクラスで宣言されたメンバー変数が使用されます.
  • ただし、定義が重複していない場合は
  • 祖先タイプの参照変数と子孫タイプの参照変数を使用する場合は区別されません.
  • 反復の場合は参照変数のタイプによりますが、反復がない場合は1つしかないので選択の余地はありません.
  • class BindingaTest{
    	public static void main(String[] args){
        	Parent p = new Child();
            Child c = new Child();
            
            System.out.println("p.x = " + p.x);
            p.method();
            System.out.println("c.x = " + c.x);
            c.method();
        }
    }
    
    class Parent{
    	int x = 100;
        
        void method()
        {
        	System.out.println("Parent Method");
        }
    }
    
    class Child extends Parent{
    	int x = 200;
        
        void method()
        {
        	System.out.println("Child Method");
        }
    }
    
    실행결과
    
    p.x = 100
    Child Method
    c.x = 100
    Child Method
    タイプは異なりますが、参照変数pとcはChildインスタンスを参照します.ParentクラスとChildクラスは同じメンバーを定義します.
    メソッド入力メソッド()では、参照変数のタイプにかかわらず、実際のインスタンスのタイプChildクラスで定義されたメソッドが呼び出されますが、インスタンス変数xは参照変数のタイプに依存します.
    class BindingaTest2{
    	public static void main(String[] args){
        	Parent p = new Child();
            Child c = new Child();
            
            System.out.println("p.x = " + p.x);
            p.method();
            System.out.println("c.x = " + c.x);
            c.method();
        }
    }
    
    class Parent{
    	int x = 100;
        
        void method()
        {
        	System.out.println("Parent Method");
        }
    }
    
    class Child extends Parent{}
    
    실행결과
    
    p.x = 100
    Parent Method
    c.x = 200
    Parent Method

  • 子クラスで祖先クラスのメンバーを繰り返し定義していない場合、参照変数のタイプは変わりません.

  • どのクラスのメンバーを呼び出すかは選択されていません.つまり、祖先のメンバーが呼び出され、子孫のメンバーが呼び出されるべきです.

  • 参照変数のタイプによって結果が異なる場合は、子クラスで祖先クラスのメンバー変数と同じ名前のメンバー変数を繰り返し定義します.
  • class BindingaTest3{
    	public static void main(String[] args){
        	Parent p = new Child();
            Child c = new Child();
            
            System.out.println("p.x = " + p.x);
            p.method();
            System.out.println("c.x = " + c.x);
            c.method();
        }
    }
    
    class Parent{
    	int x = 100;
        
        void method()
        {
        	System.out.println("Parent Method");
        }
    }
    
    class Child extends Parent{
    	int x = 200;
        
        void method()
        {
        	System.out.println("x = " + x);
            System.out.println("super.x =" + super.x);
            System.out.println("this.x =" + this.x);
        }
    }
    
    실행결과
    
    p.x = 100
    x=200
    super.x = 100
    this.x = 200
    
    c.x = 200
    x = 200
    super.x = 100
    this.x = 200
    

    パラメータの多形性

    class Product{
    	int price;			//제품 가격
        int bonusPoint;		//제품구매시 제공하는 보너스점수
    }
    
    class Tv 		extends 	Product{]
    class Computer  extends  	Product[]
    class Audio     extends 	Product[]
    
    class Buyer{
    	int money = 1000;	//소유금액
        int bonusPoint = 0;	//보너스점수
    }
    void buy(Tv t){
    	//Buyer가 가진 돈 에서 제품의 가격(t.price)만큼 뺀다.
        money = money - t.price;
        
        //Buyer의 보너스점수에 제품의 보너스 점수를 더한다
       	bonusPoint = bonusPoint + t.bonusPoint;
    }
    以上の方法ではTvしか購入できないので、他の製品を購入する方法も必要です.
    void buy(Computer c){
    	//Buyer가 가진 돈 에서 제품의 가격(c.price)만큼 뺀다.
        money = money - c.price;
        
        //Buyer의 보너스점수에 제품의 보너스 점수를 더한다
       	bonusPoint = bonusPoint + c.bonusPoint;
    }
    
    void buy(Audio a){
    	//Buyer가 가진 돈 에서 제품의 가격(a.price)만큼 뺀다.
        money = money - a.price;
        
        //Buyer의 보너스점수에 제품의 보너스 점수를 더한다
       	bonusPoint = bonusPoint + a.bonusPoint;
    }
    メソッドのパラメータに多形性を適用すると、以下に示すように、単純に1つの方法として処理することができる.
    	void buy(Product p){
        	money = money - p.money;
            bonusPoint = bonusPoint + p.bonusPoint;
        }

    配列による複数のオブジェクトの処理

    Product p[] = new Product[3];
    p[0] = new Tv();
    p[1] = new Computer();
    p[2] = new Audio();
    これにより、祖先タイプの参照変数配列を使用すると、共通の祖先を持つ異なるタイプのオブジェクトを1つの配列に組み合わせることができます.