在看视频时,会发现有一些课后题,在现在的学习阶段我想通过做题来巩固学到的知识点,这次博客分享一道面向对象的实验题。
题目如下:

1、写一个名为 Account 的类模拟账户。
该类包括的属性: 账号 id,余额 balance,年利率 annualInterestRate;
包含的方法:访问器方法(getter 和 setter 方法),返回月利率的方法 getMonthlyInterest(),取款方法 withdraw(),存款方法 deposit()。

2、写一个用户程序测试 Account 类。
在用户程序中,创建一个账号为 1122、余额为 20000、 年利率 4.5%的 Account 对象。
使用 withdraw 方法提款 30000 元,并打印余额。
再使用 withdraw 方法提款 2500 元,使用 deposit 方法存款 3000 元,然后打印余额和月利率。
(在提款方法中,需要判断用户余额是否满足提款数额的要求,如果不能,应给出提示)

3、创建 Account 类的一个子类 CheckAccount 代表可透支的账户,该账户中定义一个属性 overdraft 代表可透支限额。
在 CheckAccount 类中重写 withdraw 方法,其算法如下:
如果(取款金额<账户余额), 可直接取款 如果(取款金额>账户余额),计算需要透支的额度,判断可透支额 overdraft 是否足够支付本次透支需要,如果可以 将账户余额修改为 0,冲减可透支金额 如果不可以 提示用户超过可透支额的限额

要求:写一个用户程序测试 CheckAccount 类。在用户程序中,创建一个账号为 > > 1122、余 额为 20000、年利率 4.5%,可透支限额为 5000 元的 CheckAccount 对象。 使用 withdraw 方法提款 5000 元,并打印账户余额和可透支额。 再使用 withdraw 方法提款 18000 元,并打印账户余额和可透支额。 再使用 withdraw 方法提款 3000 元,并打印账户余额和可透支额。

这个题目的要求比较清晰,感觉比较简单,按照步骤进行,首先第一步:编写Account类

//  1、写一个名为 Account 的类模拟账户。
//  该类包括的属性: 账号 id,余额 balance,年利率 annualInterestRate;
//  包含的方法:访问器方法(getter 和 setter 方法),返回月利率的方法 getMonthlyInterest(),
//             取款方法 withdraw(),存款方法 deposit()。
public class Account    /*account:账户  */    {
	private int id;//银行卡号
	private double balance;//balance 余额的意思
	private double annualInterestRate;
	//annual interest rate 年利率, 这个变量名太长了 题目要求写这个
	
	
//	获取卡号
	public int getId() {
		return id;
	}
	
//	设置卡号
	public void setId(int id) {
		this.id = id;
	}
	
//	获取余额
	public double getBalance() {
		return balance;
	}
	
//	设置余额
	public void setBalance(double balance) {
		this.balance = balance;
	}
	
//	获取年利率
	public double getAnnualInterestRate() {
		return annualInterestRate;
	}
	
//	设置年利率
	public void setAnnualInterestRate(double annualInterestRate) {
		this.annualInterestRate = annualInterestRate;
	}
	
//	获取月利率
	public double getMonthlyInterest(){
		return annualInterestRate/12;
	}
	
	
//	取款
	public void withdraw (double amount) {
		
	}
	
//	存款
	public void deposit (double amount){
		
	}
	

}

以上代码看似复杂 其实用快捷键就可以生成getting和setter,完成Account类的编写进行下一步,写一个测试类测试一下,代码和输出结果如下:

//   2、写一个用户程序测试 Account 类。
//   在用户程序中,创建一个账号为 1122、余额为 20000、 年利率 4.5%的 Account 对象。
//   使用 withdraw 方法提款 30000 元,并打印余额。 
//   再使用 withdraw 方法提款 2500 元,使用 deposit 方法存款 3000 元,然后打印余额和月利率。
//  (在提款方法中,需要判断用户余额是否满足提款数额的要求,如果不能,应给出提示)
public class TestAccount {
		
	public static void main(String[] args) {
		Account a=new Account();//创建新的Account对象:a
		a.setId(1122);//将卡号设置为1122
		a.setBalance(20000);//初始余额为20000
		a.setAnnualInterestRate(0.045);//年利率为4.5%
		
		a.withdraw(30000);//提款30000元,注意 这里余额会不足,需要在Account类的取款方法中写控制语句
		System.out.println("余额为:"+a.getBalance());//输出余额
		
		a.withdraw(2500);//提款2500元
		a.deposit(3000);//存款3000元
		
		System.out.println("余额为"+a.getBalance()+"  月利率为:"+a.getMonthlyInterest());
		//输出余额和年利率
	}
}

为了实现输出月利率和取款的流程控制,Account类中代码需要丰富一下:

//	获取月利率
	public double getMonthlyInterest(){
		return annualInterestRate/12;
	}

	
//	取款
	public void withdraw (double amount) {
		if(amount<=balance){
			balance-=amount;
			return;
		}else {
			System.out.println("余额不足!!!");
			return;
		}
		
	}

写完上面的代码就可以进行测试,运行结果如下

java使用Bartender模板btw格式打印 java调用bartender_初学者

运行没有问题,进行下一步,编写 Account 类的一个子类 CheckAccount来实现透支功能

/*
 * 3、创建 Account 类的一个子类 CheckAccount 代表可透支的账户,该账户中定义一个属性 overdraft 代表可透支限额。
 * 在 CheckAccount 类中重写 withdraw 方法,其算法如下: 
 * 如果(取款金额<账户余额), 可直接取款 如果(取款金额>账户余额),计算需要透支的额度,
 * 判断可透支额 overdraft是否足够支付本次透支需要,如果可以  将账户余额修改为 0,冲减可透支金额
 * 如果不可以提示用户超过可透支额的限额  
 */
public class CheckAccount extends Account {
	private double overdraft;// overdraft:可透支限额

// 获取可透支限额
	public double getOverdraft() {
		return overdraft;
	}

//设置可透支限额
	public void setOverdraft(double overdraft) {
		this.overdraft = overdraft;
	}
	
//重写withdraw方法
	public void withdraw(double amount) {
		if (amount <= getBalance()) {   //如果取款金额小于等于余额
			super.withdraw(amount);		//将值返回父类取款方法中正常计算取款

		} else if (amount > getBalance()) {    //如果取款金额大于余额
			amount -= getBalance();			   //先将取款金额减去余额,获取需要透支的金额

			if (amount <= overdraft) {		             //如果需要透支的金额小于透支限额
				super.setBalance(0);		             //先将余额设置为0
				setOverdraft(getOverdraft() - amount);   //将可用透支限额刷新
			} else {
				System.out.println("可用透支额度不足!");//如果透支的金额超过了限额,输出提示语句
				return;
			}
		}
	}

}

写完这串代码已经凌晨十二点半了,希望不要报错出问题
下面根据题目要求来测试一下,先编写测试类Test

/*
 * 要求:写一个用户程序测试 CheckAccount 类。
 * 在用户程序中,创建一个账号为1122、余 额为 20000、年利率 4.5%,可透支限额为 5000元的 CheckAccount对象。 
 * 先使用 withdraw方法提款 5000 元,并打印账户余额和可透支额。 
 * 再使用 withdraw方法提款 18000元,并打印账户余额和可透支额。 
 * 再使用 withdraw方法提款 3000 元,并打印账户余额和可透支额。
 */
public class Test {
	
	public static void main(String[] args) {
	
		CheckAccount c=new CheckAccount();
		c.setId(1122);
		c.setBalance(20000);
		c.setAnnualInterestRate(4.5);
		c.setOverdraft(5000);
		
		c.withdraw(5000);
		c.withdraw(18000);
		c.withdraw(3000);
	}
}

为了增强可读性,在CheckAccount的withdraw方法增加了 输出语句

System.out.println("您的账户余额为:"+super.getBalance());
System.out.println("您的可透支额为:"+overdraft+"\n");

测试结果为:

java使用Bartender模板btw格式打印 java调用bartender_实验题_02

结果是正确的,但是这个代码有些问题
下次更新优化一下这个代码