天天看點

Java第一階段(8)【 面向對象 - 繼承和多态】 11.15繼承方法的重寫多态練習

第一階段

  • 繼承
  • 方法的重寫
  • 多态
  • 練習

繼承

  • java內建體系:

    繼承關系類與類之間的關系

    類與接口之間的關系

  • extends 繼承 implements 實作/接口

    一些具有相同屬性的事物進行總結

    自行車/公共汽車/的士 → 車

    把一些具有相同屬性的類進行向上抽離,建立一個類

    這個類就是具有相同屬性的類叫做父類(超類),這些相同屬性的類稱為父類的子類(派生類)

  • 繼承的書寫方式 :

    1.建立一個類,在類名後面 extends 跟上父類的名字

    2.在建立類時superclass文本框中寫入父類的完整路徑(跟上包名,可alt+/快捷)

  • 繼承關系的特點:

    1.類與類之間隻支援單繼承(一個子類隻能有一個父類)

    2.java中類是支援多層繼承

    3.如果子類繼承父類,則繼承了父類中所有的屬性和成員方法。

    4.隻有構造方法不會繼承

    5.子類無法直接通路父類中私有的屬性,可以通過父類公共的通路方式進行通路

  • 繼承的作用

    提高代碼的可維護性和拓展性 節約代碼量

方法的重寫

  • 子類繼承父類的方法後,需要一些自己特有的功能
  • 重寫的概念:出現在繼承體系中,方法名相同,參數清單相同,傳回值類型相同
  • 與重載的差別:出現在同一類中,方法名相同,參數清單不同,與傳回值無關

多态

  • 生活中的多态:一種事物根據不同條件,所産生不同的結果
  • 面向對象中多态的前提條件(條件必須同時滿足):

    1.必須出現在繼承體系中

    2.必須有方法的重寫

    3.建立對象時,必須 父類引用指向 子類對象

             父 取個名字 = new 兒子();

             Animals an = new Cat();//向上轉型(兒子穿着父親的外套)

  • 向上轉型的特點:

    左邊父類,右邊子類

    通路特點:1.通路成員屬性(編譯看左邊,運作看左邊)

         2.通路成員方法(編譯看左邊,運作看右邊)

  • 向下轉型(強轉)

    子類引用 指向 父類對象

    Cat c = (Cat) an;

  • 應用:

    當 某些引用資料類型 作為形式參數

  • 詳解可看這裡:https://blog.csdn.net/qq_42829628/article/details/84112584

練習

  • 打地鼠(多敵人)

    1.将打地鼠遊戲進行面向對象處理,分為:洞穴類,玩家類,地鼠類,裁判類,遊戲運作類,main方法類。

    2.洞穴類:參考屬性:洞穴的類型O,方法:列印洞穴的方法

    3.玩家類:屬性:玩家輸入的行與列,方法:玩家擊打的方法

    4.地鼠類:屬性:地鼠出現的行與列,地鼠的價值分數,方法:地鼠出現的方法X

    5.裁判類:屬性:遊戲次數,得分,擊中次數,未擊中次數,方法:判斷打中的方法

    6.遊戲運作的類: 寫start()方法

    7.遊戲循環10次,統計得分,擊中,未擊中

    8.99-重新開始,88-退出遊戲

    9.使用繼承多态出現不同的敵人,敵人屬性:敵人類型M 10,S 20,W 30 每次出現一隻

    10.Mouse全局出現,Snake隻出現在前兩列,Wolf隻出現在後兩行

--------- Drop 類-----------

package game_DiShu;

//洞穴類
public class Drop {
	// 成員屬性
	private char dropName = 'o'; // 洞穴
	private int dropRow; // 行數
	private int dropColumn; // 列數

	// 擷取洞穴名
	public char getDropName() {
		return dropName;
	}

	// 修改洞穴名
	public void setDropName(char dropName) {
		this.dropName = dropName;
	}

	// 擷取洞穴行數
	public int getDropRow() {
		return dropRow;
	}

	// 修改洞穴行數
	public void setDropRow(int dropRow) {
		this.dropRow = dropRow;
	}

	// 擷取洞穴列數
	public int getDropColumn() {
		return dropColumn;
	}

	// 修改洞穴列數
	public void setDropColumn(int dropColumn) {
		this.dropColumn = dropColumn;
	}

	// 構造函數
	public Drop() {

	}

	// 成員方法

	// 列印洞穴的方法
	public char[][] printDrop(Drop d) {
		// 建立一個二維數組pDrop,值分别為洞穴的行數與列數
		char[][] pDrop = new char[d.getDropRow()][d.getDropColumn()];
		// 周遊這個數組,列印洞穴初始形态
		for (int i = 0; i < pDrop.length; i++) {
			for (int j = 0; j < pDrop[i].length; j++) {
				pDrop[i][j] = 'o';
				System.out.print(pDrop[i][j] + " ");
			}
			System.out.println();
		}
		// 傳回這個二維數組,後期使用
		return pDrop;
	}
}
           

--------- Player 類-----------

package game_DiShu;

import java.util.Scanner;

//玩家類
public class Player {
	// 成員屬性
	private int playerRow; // 玩家輸入的行
	private int playerColumn; // 玩家輸入的列

	// 擷取玩家輸入的行
	public int getPlayerRow() {
		return playerRow;
	}

	// 修改玩家輸入的行
	public void setPlayerRow(int playerRow) {
		this.playerRow = playerRow;
	}

	// 擷取玩家輸入的列
	public int getPlayerColumn() {
		return playerColumn;
	}

	// 修改玩家輸入的列
	public void setPlayerColumn(int playerColumn) {
		this.playerColumn = playerColumn;
	}

	// 構造方法
	public Player() {

	}

	// 成員方法
	// 玩家打擊的方法(感覺放在外面更好判斷特殊情況,于是就寫在了外面)
	public void playerWrite(Judge ju) {
		System.out.println("----------------");
		// 列印第幾次遊戲
		System.out.println("第" + ju.getNum() + "次遊戲");

		System.out.println("地鼠出現了,請打擊(先行後列,回車确定      99-重新開始    88-結束遊戲)");
	}

}
           

--------- Animals 類-----------

package game_DiShu;

import java.util.Random;

//父類:動物類
public class Animals {
	private int row; // 出現的行
	private int column; // 出現的列
	private int score;// 動物的分數

	// 構造方法
	public Animals() {

	}

	public int getRow() {
		return row;
	}

	public void setRow(int row) {
		this.row = row;
	}

	public int getColumn() {
		return column;
	}

	public void setColumn(int column) {
		this.column = column;
	}

	public int getScore() {
		return score;
	}

	public void setScore(int score) {
		this.score = score;
	}

	//動物出現的方法(後面重寫)
	public void Appear(char[][] pDrop, Drop d) {

	}

	// 動物傳遞分數的方法
	public void score(int s) {
		score = s;
	}
	//行與列的傳遞(用于裁判類)
	public void rowColumn(int a, int b) {
		this.row = a;
		this.column = b;
	}

}
           

--------- Mouse 類-----------

package game_DiShu;

import java.util.Random;

//地鼠類
public class Mouse extends Animals {

	// 構造方法
	public Mouse() {
		//把地鼠的分數傳遞給父類,供裁判類使用
		super.score(10);
	}

	// 成員方法
	// 地鼠出現的方法
	public void Appear(char[][] pDrop, Drop d) {
		// new随機對象
		Random r = new Random();
		// 地鼠随機出現位置的行與列(随機數為洞穴的行與列)
		setRow(r.nextInt(d.getDropRow()));
		setColumn(r.nextInt(d.getDropColumn()));
		// 設定洞穴的 地鼠行 與 地鼠列 為"M"
		pDrop[getRow()][getColumn()] = 'M';
		// 周遊
		for (int i = 0; i < pDrop.length; i++) {
			for (int j = 0; j < pDrop[i].length; j++) {
				System.out.print(pDrop[i][j] + " ");
			}
			System.out.println();
		}
		//把行與列傳給父類rowColumn方法
		super.rowColumn(getRow(), getColumn());

	}

}
           

--------- Snake 類-----------

package game_DiShu;

import java.util.Random;

//蛇類
public class Snake extends Animals {

	// 構造方法
	public Snake() {
		//把蛇的分數傳遞給父類,供裁判類使用
		super.score(20);
	}

	// 成員方法
	// 蛇出現的方法
	public void Appear(char[][] pDrop, Drop d) {
		// new随機對象
		Random r = new Random();

		// 蛇随機出現位置的行與列
		setRow(r.nextInt(d.getDropRow()));
		//隻出現在前兩列
		setColumn(r.nextInt(2));
		// 設定洞穴的 蛇行 與 蛇列 為"M"
		pDrop[getRow()][getColumn()] = 'S';
		// 周遊
		for (int i = 0; i < pDrop.length; i++) {
			for (int j = 0; j < pDrop[i].length; j++) {
				System.out.print(pDrop[i][j] + " ");
			}
			System.out.println();
		}
		//把行與列傳給父類rowColumn方法
		super.rowColumn(getRow(), getColumn());
	}
}
           

--------- Wolf 類-----------

package game_DiShu;

import java.util.Random;

public class Wolf extends Animals {
	// 構造方法
	public Wolf() {
		//把狼的分數傳遞給父類,供裁判類使用
		super.score(30);
	}

	// 成員方法
	// 狼出現的方法
	public void Appear(char[][] pDrop, Drop d) {
		// new随機對象
		Random r = new Random();
		// 狼随機出現位置的行與列
		//把手動輸入的行數放到一維數組中,進行使用
		int[] arr = { d.getDropRow() - 1, d.getDropRow() - 2 };
		int ra = r.nextInt(2);
		//行數為随機的後兩行
		setRow(arr[ra]);
		setColumn(r.nextInt(d.getDropColumn()));
		// 設定洞穴的 狼行 與 狼列 為"W"
		pDrop[getRow()][getColumn()] = 'W';
		// 周遊
		for (int i = 0; i < pDrop.length; i++) {
			for (int j = 0; j < pDrop[i].length; j++) {
				System.out.print(pDrop[i][j] + " ");
			}
			System.out.println();
		}
		//把行與列傳給父類rowColumn方法
		super.rowColumn(getRow(), getColumn());
	}
}
           

--------- Judge 類-----------

package game_DiShu;

//裁判類
public class Judge {

	private int num = 1; // 遊戲次數
	private int score = 0; // 總得分
	private int hit; // 擊中次數
	private int miss; // 未擊中次數

	// 擷取遊戲次數
	public int getNum() {
		return num;
	}

	// 修改遊戲次數
	public void setNum(int num) {
		this.num = num;
	}

	// 擷取總得分
	public int getScore() {
		return score;
	}

	// 修改總得分
	public void setScore(int score) {
		this.score = score;
	}

	// 擷取擊中數
	public int getHit() {
		return hit;
	}

	// 修改擊中數
	public void setHit(int hit) {
		this.hit = hit;
	}

	// 擷取未擊中數
	public int getMiss() {
		return miss;
	}

	// 修改未擊中數
	public void setMiss(int miss) {
		this.miss = miss;
	}

	// 構造方法
	public Judge() {

	}

	// 成員方法
	
	
	// 判斷是否打中的方法
	public void whetherHit(char[][] pDrop, Player p, Animals an) {
		// 如果玩家輸入的行數和地鼠出現的行數相同,并且玩家輸入的列數和地鼠出現的列數相同,則為擊中
		if (p.getPlayerRow() == an.getRow() && p.getPlayerColumn() == an.getColumn()) {
			System.out.println("----------");
			System.out.println("【恭喜你擊中了】");

			// 總分數等于之前的得分加上分數
			score += an.getScore();
			// 擊中次數增加
			hit++;

		} else {
			System.out.println("----------");
			System.out.println("【很遺憾,未擊中】");
			// 未擊中次數增加
			miss++;
			score--;
		}

		// 遊戲次數增加
		num++;
		// 還原洞穴
		pDrop[an.getRow()][an.getColumn()] = 'o';
	}
}
           

--------- Game 類-----------

package game_DiShu;

import java.util.Random;
import java.util.Scanner;

//運作類
public class Game {
	public void start() {

		int pan = 1;// 初始個判斷值,用于輸入行列數處
		Drop d = new Drop();// 洞穴對象
		Player p = new Player();// 玩家對象
		Animals an = new Animals();// 動物對象(父類)
		Judge ju = new Judge();// 裁判對象
		Random r = new Random();// 随機數對象
		Scanner s = new Scanner(System.in);// 鍵盤輸入對象

		// 歡迎的方法
		welcome();
		// 當判斷值為1時,執行
		while (pan == 1) {
			System.out.println("請輸入您想挑戰的行數,回車确定(必須大于等于三行)");
			d.setDropRow(s.nextInt());
			System.out.println("請輸入您想挑戰的列數,回車确定(必須大于等于三列)");
			d.setDropColumn(s.nextInt());
			// 如果輸入的數大于3,則程式繼續運作,否則傳回循環
			if (d.getDropRow() >= 3 && d.getDropColumn() >= 3) {
				pan = 2;
			} else {
				System.out.println("輸入有誤,請重新輸入");
				pan = 1;
			}
		}

		// 建立一個二維數組去擷取洞穴
		char[][] pDrop = d.printDrop(d);

		System.out.println("--------------");
		System.out.println("請注意,地鼠出現了");
		System.out.println("↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
		// 當遊戲次數小于10時循環
		while (ju.getNum() <= 10) {

			int ra = r.nextInt(3);
			// 當随機數為0時,地鼠出現
			if (ra == 0) {
				an = new Mouse();
				// 出現的方法
				an.Appear(pDrop, d);
				// 當随機數為1時,蛇出現
			} else if (ra == 1) {
				an = new Snake();
				// 出現的方法
				an.Appear(pDrop, d);
				// 狼出現
			} else {
				an = new Wolf();
				// 出現的方法
				an.Appear(pDrop, d);
			}

			// 玩家擊打
			p.playerWrite(ju);
			// 玩家輸入行數
			p.setPlayerRow(s.nextInt() - 1);
			// 如果玩家99重新開始
			if (p.getPlayerRow() == 98) {
				System.out.println("---------");
				System.out.println("重新開始遊戲");
				pDrop[an.getRow()][an.getColumn()] = 'o';
				ju = new Judge();
				continue;
			}
			// 如果玩家88退出遊戲
			if (p.getPlayerRow() == 87) {
				System.out.println("---------");
				System.out.println("退出遊戲");
				return;
			}
			// 玩家輸入列
			p.setPlayerColumn(s.nextInt() - 1);

			// 是否打中的方法
			ju.whetherHit(pDrop, p, an);

		}

		System.out.println("--------");
		System.out.println("遊戲結束");
		System.out.println("最終得分:" + ju.getScore() + "分");
		System.out.println("擊中" + ju.getHit() + "次");
		System.out.println("未擊中" + ju.getMiss() + "次");

	}

	public void welcome() {
		System.out.println("歡迎來到打地鼠遊戲");
		System.out.println("--------------");
	}
}
           

--------- Test 類-----------

package game_DiShu;
//測試類
public class Test {
	public static void main(String[] args) {
		new Game().start();
	}
}