第一階段
- 繼承
- 方法的重寫
- 多态
- 練習
繼承
-
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();
}
}