这里将自己学习java及其应用的一些笔记、积累分享一下,如果涉及到了文章、文字侵权,请联系我删除或调整。
一、抽象类
1.1 概述
可以理解为“半成品类”,没有完成的类。
抽象类不能创建对象。
1.2 抽象方法
- 只有方法的定义,没有方法的实现代码。
public abstract void f();
- 作用:
作为通用方法,在父类中定义。
要求子类必须完成这个方法。
1.3 练习:猜字母游戏 and 猜数字游戏
已经随机产生了
5
个不重复的大写字母。请猜这5
个字母(KSNUR)。其中,A表示字母正确,且字母在字符串中的顺序也正确;B表示字母正确,但字母在字符串中的顺序不正确。
猜:
SKNUZ
2A2B
猜:
KSNZR
4A0B
猜:
SNURZ
0A4B
猜:
UUUUU
1A4B
猜:
KSNUR
5A0B
package 猜字符;
import java.util.Scanner;
/*
* 封装两种游戏的通用代码
*/
public abstract class GuessGame {
// 通用游戏流程代码
public void start() {
// 产生随机值
String r = suiji();// 因此要支持不同的游戏类型,则通过调用方法,由子类各自实现
System.out.println(r);
// 显示游戏提示
while (true) {
System.out.println("猜:");
String c = new Scanner(System.in).nextLine();
// 比对猜的值与正确答案
String jieGuo = bidui(c, r);
System.out.println(jieGuo);
// jieGuo是否是猜对的结果
if (caidui(jieGuo)) {
System.out.println("您猜对了!");
break;
}
}
}
// 定义了四个抽象方法,其具体实现在子类中根据子类需求依次完成
public abstract String suiji();
public abstract void tishi();
public abstract String bidui(String c, String r);
public abstract boolean caidui(String jieGuo);
}
package 猜字符;
import java.util.Random;
// 猜数字游戏
public class GuessNumber extends GuessGame{
// 随机产生目标数字1-1000
@Override
public String suiji(){
int num = new Random().nextInt(1000)+1;
// String.valueOf(r)
// 将任何类型数据r变成字符串
return String.valueOf(num);
}
// 欢迎界面,提示信息
@Override
public void tishi() {
System.out.println("欢迎来到数字“猜猜猜!!!”");
System.out.println("现在我们随机产生了一个1-1000的数字,请你猜猜看!加油吧,骚年!");
}
// 根据用户输入,比对猜测结果
@Override
public String bidui(String c, String r) {
int num_c = Integer.parseInt(c);
int num_r = Integer.parseInt(r);
String bidui;
if(num_c>num_r) {
bidui = "比正常数字大";
}else if (num_c< num_r) {
bidui = "比正常数字小";
}else {
bidui = "相等";
}
return bidui;
}
// 返回猜的结果对错与否
@Override
public boolean caidui(String jieGuo) {
return jieGuo.equals("相等");
}
}
package 猜字符;
import java.util.Random;
// 猜字符游戏
public class GuessLetter extends GuessGame{
@Override
public String suiji() {
// 随机产生5个不重复的大写字母
StringBuilder sb = new StringBuilder("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
char temp;
for(int i = 0;i<5;i++) {
int index = new Random().nextInt(26-i);
temp = sb.charAt(i); // 返回指定下标的字符
sb.setCharAt(i, sb.charAt(index));
sb.setCharAt(index, temp);// 设置指定下标index的字符为,temp
}
// StringBuilder.delete(start, end)删除指定下标间的字符
// StringBuilder.toString()将StringBuilder的字符内容新建为一个String对象
return sb.delete(5, 26).toString();
}
@Override
public void tishi() {
System.out.println("欢迎来到字母“猜猜猜!!!”");
System.out.println("现在我们随机产生了一个长度为5的字符串(字符来源于26个大写字母构成),请你猜猜看!加油吧,骚年!");
}
@Override
public String bidui(String c, String r) {
int num_a = 0;
int num_b = 0;
// 外循环通过i遍历字符串c(猜测的字符串)
for(int i = 0;i<c.length();i++) {
// 内循环通过j遍历字符串r(目标的字符串)
for(int j = 0;j < r.length();j++) {
// charAt()返回的是char类型字符,属于基本类型,可以通过==判断
// char类型本质上就是一个整数
if(c.charAt(i)==r.charAt(j) ) {
num_b ++;
if(i==j) {
num_a ++;
}
break; // 因为当前循环已经满足字符与下标相等,无需再遍历
}
}
}
return num_a+"A"+num_b+"B";
}
@Override
public boolean caidui(String jieGuo) {
// TODO 稍后
return jieGuo.equals("5A0B");
}
}
package 猜字符;
/*
* 已经产生了5个不重复的大写字母,请猜这5个字母:
* 1. 猜对了,但位置不对 ,显示F;
* 2.猜对了,位置也对了,显示T
* 3。猜错了,什么也不显示
*
*/
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
GuessGame game;
// 选择游戏种类
System.out.println("请问您想玩什么游戏:1.猜数字,2猜字母");
System.out.println("请选择>");
int r = new Scanner(System.in).nextInt();
// 创建游戏对象
if(r== 1) {
game = new GuessNumber();
game.tishi();
}else {
game = new GuessLetter();
game.tishi();
}
// 启动游戏
game.start();
}
}