PHASE2 LOG

主にIT関連・ゲームのログ

Javaのお勉強~多態性の利用~

      2016/03/12

前回、お勉強した多態性を利用する例をもうちょっと見てみます。

 

 

サブクラスからスーパクラスのオブジェクトを生成

 

サブクラスのオブジェクトは、スーパクラスのオブジェクトとして生成することができます。

 

スーパクラスをA、サブクラスをBとするとこんな感じで記述します。

//スーパクラス
class A{
	int No = 1;
}

//サブクラス
class B extends A{	
	int No = 2;
	
	void test(){
	}
}

public class Tataisei {
	public static void main(String[] args){
		//スーパクラスのオブジェクト
		A a1 = new A();
		//サブクラスのオブジェクト
		B b = new B();
		
		//BからAを生成
		A a2 = new B();
		System.out.println(a2.No);
	}
}

 

サブクラスからスーパクラスのオブジェクトを生成している箇所は「A a2 = new B();」のところです。

図で表すとこんな感じです。

tataisei3

 

サブクラスBのオブジェクトをスーパクラスのオブジェクトとして生成しているので、

出力されるNoは「1」となります。

 

スーパクラスへオブジェクトを代入する

 

サブクラスのオブジェクトはスーパクラスのオブジェクトへ代入することができます。

 

ちょっと今回の私が作ったサンプルで、使い方があってるか自信がないので

あくまで参考程度にしてください…(;´∀`)

 

確信持てるものが出来たら修正します。

//スーパクラス
class C{
	void Hello() {
		System.out.println("Hello!");
	}
}

//サブクラス
class D extends C{	
	void Hello() {
		System.out.println("こんにちは!");
	}
	
	//メソッドにCクラスのオブジェクトを受け取る
	void Print(C c) {
		c.Hello();
	}
}

public class Tataisei2 {
	public static void main(String[] args){
		D d = new D();
		d.Print(d);
	}
}

 

 

 

メソッドに「void Print(C c)」でスーパクラスであるCクラスのオブジェクトを受け取ります。

そこにmain()メソッドでPrint()メソッドにサブクラスであるDクラスのメソッドを渡す

ことも出来る…ってことを言いたいのかな?w

 

曖昧なのでもう少し勉強します。。。

 

抽象クラスの活用

 

サブクラスでオーバーライドしようとしているメソッドには、スーパクラスで抽象メソッドにしちゃいましょう。

そうすることで処理を後で決めることが出来ます!

 

例がこちらです。

 

//スーパクラス
abstract class Buy{
	int money;
	int kakaku;
	
	//後で処理を決めるための抽象メソッド
	abstract int Result();
	
	void Print() {
		System.out.println(Result()+ "円");
	}
	
	//セッター
	void setData(int a, int b) {
		money = a;
		kakaku = b;
	}
}

//サブクラス
class Customer extends Buy {
	//処理を決定する
	int Result() { return money - kakaku; }
}

public class Tataisei3 {
	public static void main(String[] args){
		//引数に渡す値の設定
		int m = 10000, k = 5000;
		
		//スーパクラスのオブジェクトとして生成
		Buy customer = new Customer();
		customer.setData(m, k);
		System.out.println("所持金:" + m + "円 価格:" + k + "円 ");
		customer.Print();
	} 
}

 

Result()メソッドで出力する結果をあとで決めたいとすると、スーパクラスでは宣言だけしておきます。

中身は継承したサブクラスでオーバーライドしていますね。

 

逆にPrint()メソッドやsetData()メソッドなどはスーパクラスで定義しておくと、

継承した際にいちいち書き換える必要がありませんね。

 

多態性をしっかり理解して、オブジェクト指向の考えに沿ったプログラミングができるようになりたいです!

 

 

人気ブログランキング

 -