Java学习笔记(20)——抽象类

这里将自己学习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();	
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值