java大作业(9)--实现银行基本操作(第一遍)

2024-04-18 12:20

本文主要是介绍java大作业(9)--实现银行基本操作(第一遍),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.题目:

二.代码:

实现代码:
import java.util.Date;
//银行账户类
class Account{public String accountid;public String name;public double balance;public Date creatTime;public Account(String accountid,String name, double balance){this.accountid=accountid;this.name=name;this.balance=balance;this.creatTime=new Date();//使用系统时间作为账户建立时间。}//存款public void deposit(double amount){balance=balance+amount;}//取款public void withdraw(double amount){if(balance>=amount)balance=balance-amount;elseSystem.out.println("余额不足!");}//转账public void transfer(Account receiver,double amount){if(balance>=amount){balance=balance-amount;receiver.deposit(amount);System.out.println("转账成功!");}else{System.out.println("余额不足,转账失败!");}}//查询余额public double getBalance(){return balance;}
}
//定期账户类
class FixedTermAccount extends Account{private int term;public FixedTermAccount(String accountid,String name,double balance,int term){super(accountid,name,balance);this.term=term;}//重写取款方法public void withdraw(double amount){Date now=new Date();long diff=now.getTime()-this.creatTime.getTime();//获取账户建立时间到现在的时间差long days=diff/(1000*60*60*24);//转换为天数if (days>=term*365) {super.withdraw(amount);//到期才能取钱}else{System.out.println("定期账户未到期,不能取款!");}}}
//信用卡账户类
class CreatitCardAccount extends Account{private double overdraft;public CreatitCardAccount(String accountid,String name,double balance ,double overdraft){super(accountid,name,balance);this.overdraft=overdraft;}//重写取款方法public void withdraw(double amount){if(balance+overdraft>=amount){//考虑透支额度balance=balance-amount;}else{System.out.println("超出信用额度,取款失败");}}//重写转账方法public void transfer(Account receiver ,double amount){System.out.println("信用卡账户不能进行转账!");}
}
测试代码:
public class AccountManager{public static void main(String[] args){//创立两个用户Account account1=new Account("001","张三",1000);Account account2=new Account("002","李四",300);//分别存入500元account1.deposit(500);account2.deposit(500);//张三取出200元account1.withdraw(200);//张三给李四300元account1.transfer(account2,300);//显示余额System.out.println("张三的余额:"+account1.getBalance());System.out.println("李四的余额:"+account2.getBalance());//创建定期账户和信用卡账户进行操作FixedTermAccount count1=new FixedTermAccount("001","张三",3000,3);CreatitCardAccount count2=new CreatitCardAccount("002","李四",4000,10000);count1.withdraw(200);//测试count1取钱200元count1.withdraw(3000);//测试count1取钱3000元count1.deposit(5000);//测试count1存钱5000元count2.withdraw(12000);//测试count2取钱12000元count2.withdraw(20000);//测试count2取钱20000元count2.deposit(6000);//测试count2存钱6000元count2.withdraw(20000);//测试count2取钱20000元;}
}
输出:

三.解释:

实现代码:
第1行
import java.util.Date;

在Java中,import java.util.Date; 语句的作用是导入 java.util 包中的 Date 类,这样你就可以在你的代码中使用 Date 类而不需要每次都写出完整的类名 java.util.Date。

Date 类是Java的一个核心类,用于表示特定的瞬间,精确到毫秒。这个类通常用于表示日期和时间,特别是在没有更高级的日期和时间API可用时。

当你导入 Date 类后,你可以在你的代码中创建 Date 对象,比如用于记录某个事件发生的时间,或者用于比较两个日期等。

import java.util.Date;  public class Example {  public static void main(String[] args) {  // 创建一个表示当前日期和时间的Date对象  Date now = new Date();  // 输出当前日期和时间  System.out.println("Current date and time: " + now);  // 创建一个表示特定日期和时间的Date对象  Date specificDate = new Date(123456789000L); // 这里的数字是毫秒数,表示从1970年1月1日00:00:00 GMT开始的毫秒数  // 输出特定日期和时间  System.out.println("Specific date and time: " + specificDate);  }  
}

在这个例子中,我们导入了 Date 类,并创建了两个 Date 对象:一个表示当前的日期和时间,另一个表示一个特定的日期和时间(通过传递一个长整型的毫秒数给 Date 构造函数)。

然而,值得注意的是,从Java 8开始,引入了新的日期和时间API(java.time 包),它提供了更强大、更灵活且类型安全的日期和时间处理功能。因此,在大多数现代Java应用中,你可能会更倾向于使用 java.time 包中的类,比如 LocalDateLocalTimeLocalDateTime 等,而不是 java.util.Date。但 Date 类仍然在某些旧的代码库和API中被广泛使用。

第3~7行
class Account{public String accountid;public String name;public double balance;public Date creatTime;

定义了Account类,然后没有封装属性,用了public来公开属性。

所有这四个字段都是 public 的,这意味着它们可以从类的外部直接访问和修改。然而,这种设计通常不被推荐,因为它破坏了封装性,这是面向对象编程的一个基本原则。封装性意味着隐藏对象的内部状态(即字段的值)并仅通过公共方法来访问和修改这些值。这有助于保护数据的完整性和安全性,并提供更清晰、更易于维护的代码。

这个 Account 类是一个简单的Java类,用于表示银行账户。然而,由于所有字段都是公共的,它违反了封装性的原则。为了改进这个类,应该将这些字段设置为 private

private String accountid;  private String name;  private double balance;  private LocalDateTime createTime; // 修正拼写错误,并使用LocalDateTime  
第9-12行
    public Account(String accountid,String name, double balance){this.accountid=accountid;this.name=name;this.balance=balance;

初始化属性

第13行
this.creatTime=new Date();//使用系统时间作为账户建立时间。
  • 这行代码创建了一个新的Date对象(来自java.util包),该对象表示构造方法被调用时的系统当前时间,并将这个Date对象赋值给当前对象的creatTime属性。这行代码实际上是在记录账户创建的时间。
第16-18行
    public void deposit(double amount){balance=balance+amount;}

这段代码是Java语言中的一个方法定义,用于描述一个deposit(存钱操作,通常用于银行账户或类似的金融应用中。下面是对这段代码的详细解释:

方法定义

  • public: 这是一个访问修饰符,它表明这个方法可以从任何其他类中被访问。
  • void: 这表明该方法没有返回值。
  • deposit: 这是方法的名称,表示这是一个存款方法。
  • (double amount): 这是方法的参数列表。它接受一个double类型的参数amount,代表要存入的金额。

方法体

  • balance=balance+amount;: 这是方法体中的唯一一条语句。它表示将当前的balance(账户余额)与传入的amount(存款金额)相加,并将结果赋值回balance。这样,balance就被更新为新的余额了。

第20-15行
    public void withdraw(double amount){if(balance>=amount)balance=balance-amount;elseSystem.out.println("余额不足!");}

这段代码定义了一个withdraw(取款)方法,用于从银行账户中提取指定金额的资金。以下是对该方法的详细解释:

方法定义

  • public: 方法的访问修饰符,表示该方法可以从任何其他类中被访问。
  • void: 表示该方法没有返回值。
  • withdraw: 方法的名称,表示取款操作。
  • (double amount): 方法的参数,一个double类型的amount,表示要提取的金额。

方法体

  • if(balance>=amount): 这是一个条件判断语句,它检查当前的账户余额balance是否大于或等于要提取的金额amount
    • balance=balance-amount;: 如果余额足够(即balance >= amount),则从余额中减去提取的金额,更新账户余额。
  • else: 如果余额不足(即balance < amount),则执行下面的语句。
    • System.out.println("余额不足!");: 在控制台上打印一条消息,告知用户余额不足,无法提取所请求的金额。
第27-37行
    public void transfer(Account receiver,double amount){if(balance>=amount){balance=balance-amount;receiver.deposit(amount);System.out.println("转账成功!");}else{System.out.println("余额不足,转账失败!");}}

 这段代码定义了一个transfer方法,用于从当前账户向另一个账户(receiver)转账指定金额(amount。下面是对该方法的详细解释:

方法定义

  • public: 方法的访问修饰符,表示该方法可以从任何其他类中被访问。
  • void: 表示该方法没有返回值。
  • transfer: 方法的名称,表示转账操作。
  • (Account receiver, double amount): 方法的参数列表,包括两个参数:
    • Account receiver: 一个类型为Account的对象,表示接收转账的账户。
    • double amount: 一个double类型的值,表示要转账的金额。

方法体

  • if(balance>=amount): 这是一个条件判断语句,它检查当前账户的余额balance是否大于或等于要转账的金额amount
    • balance=balance-amount;: 如果余额足够(即balance >= amount),则从当前账户的余额中减去转账的金额。
    • receiver.deposit(amount);: 将要转账的金额存入接收账户(receiver)。这里假设Account类有一个deposit方法用于存款。
    • System.out.println("转账成功!");: 在控制台上打印一条消息,告知用户转账成功。
  • else: 如果余额不足(即balance < amount),则执行下面的语句。
    • System.out.println("余额不足,转账失败!");: 在控制台上打印一条消息,告知用户由于余额不足,转账失败。
第39-41行
    public double getBalance(){return balance;}

这段代码定义了一个名为getBalance的公共方法,它返回当前账户的余额。下面是该方法的详细解释:

方法定义

  • public: 这是一个访问修饰符,表示这个方法可以从任何其他类中被访问。
  • double: 这是方法的返回类型,表示这个方法将返回一个double类型的值。
  • getBalance: 这是方法的名称,它遵循了Java中常见的命名约定,即使用“get”前缀来命名返回某个属性值的访问器方法。
  • (): 这是方法的参数列表,括号内为空表示这个方法没有参数。

方法体

  • return balance;: 这是方法的返回语句,它返回balance变量的当前值。balance是假设在Account类中定义的一个私有成员变量,用来存储账户的余额。
第44行
class FixedTermAccount extends Account{

FixedTermAccount extends Account 这段代码表示FixedTermAccount类是从Account类继承而来的。在Java中,继承是面向对象编程的一个核心概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。

在这个例子中,FixedTermAccount是子类,Account是父类。FixedTermAccount继承了Account类中的所有公共(public)和保护(protected)属性和方法,这意味着FixedTermAccount类的对象可以使用这些属性和方法,除非它们在FixedTermAccount类中被覆盖(重写)。

第45行
 private int term;

FixedTermAccount类中,如果你有一个私有成员变量term,它可能用来表示账户的固定期限。这个term变量可能以月、天或其他时间单位来衡量,具体取决于你的业务需求和系统设计。

第46-49行
public FixedTermAccount(String accountid,String name,double balance,int term){super(accountid,name,balance);this.term=term;}

基本继承

注意super传递

第52-62行
    public void withdraw(double amount){Date now=new Date();long diff=now.getTime()-this.creatTime.getTime();//获取账户建立时间到现在的时间差long days=diff/(1000*60*60*24);//转换为天数if (days>=term*365) {super.withdraw(amount);//到期才能取钱}else{System.out.println("定期账户未到期,不能取款!");}}

在你提供的withdraw方法中,你尝试根据账户的建立时间和当前时间之间的差异来判断是否达到了固定期限(term),从而决定是否允许取款。这里有几个问题需要注意:

  1. creatTime变量没有在代码中定义。它应该是一个Date类型的成员变量,用于存储账户的建立时间。你需要确保在FixedTermAccount类中定义了这个变量,并且在创建账户时对其进行了初始化。

  2. term变量被假设为以年为单位。但是,你的代码将term直接与天数相乘(term*365),这没有考虑到闰年的情况。一个更精确的方法是使用Calendar类来计算具体的日期差异。

  3. System.out.println用于输出错误信息到控制台。在实际应用中,更好的做法可能是抛出一个异常或者返回一个错误信息给调用者,以便调用者可以适当地处理这种情况。

第66-71行
class CreatitCardAccount extends Account{private double overdraft;public CreatitCardAccount(String accountid,String name,double balance ,double overdraft){super(accountid,name,balance);this.overdraft=overdraft;}

这一行定义了一个公共的构造方法,用于创建CreatitCardAccount对象。构造方法的名字与类名相同,它没有返回值(返回类型为void)。

  • 构造方法接受四个参数:accountid(账户ID),name(账户名),balance(账户余额),和overdraft(透支额度)。
  • super(accountid, name, balance);:这一行调用了父类Account的构造方法,并将accountidnamebalance作为参数传递给它。这是子类构造方法调用父类构造方法的常见方式,以确保父类中的属性和方法被正确初始化。
  • this.overdraft = overdraft;:这一行将构造方法参数中的overdraft值赋给类的overdraft属性。this关键字用于引用当前对象的属性和方法,以避免与参数名或局部变量名冲突。

需要注意的是,代码中有一个小错误:类名CreatitCardAccount可能是CreditCardAccount的拼写错误。在实际编程中,应该使用正确的拼写和命名规范来避免混淆和错误。

另外,从这段代码中我们不能看到Account类的具体实现,但可以推测Account类至少有一个接受accountidnamebalance作为参数的构造方法。

 

第74-82行
    public void withdraw(double amount){if(balance+overdraft>=amount){//考虑透支额度balance=balance-amount;}else{System.out.println("超出信用额度,取款失败");}}

 withdraw方法,这个方法用于从账户中取款。

  1. public void withdraw(double amount): 这是一个公共方法,名为withdraw,它接受一个double类型的参数amount,表示要取款的金额。方法没有返回值,所以返回类型为void

  2. if(balance+overdraft>=amount): 这是一个条件判断语句。它检查当前账户的余额(balance)加上透支额度(overdraft)是否大于或等于要取款的金额(amount)。如果是这样,说明账户有足够的资金(包括透支额度)来支持这次取款。

  3. balance=balance-amount;: 如果上面的条件成立,这行代码会从账户的余额中减去取款的金额。这样,账户的余额就会减少相应的金额。

  4. else: 如果上述条件不成立,即账户余额加上透支额度仍然不足以支持取款,那么会执行else块中的代码。

  5. System.out.println("超出信用额度,取款失败");: 这行代码会在控制台上输出一条消息,告诉用户因为超出了信用额度,所以取款失败。

 

第84-87行

    public void transfer(Account receiver ,double amount){System.out.println("信用卡账户不能进行转账!");}
}

在您提供的transfer方法中,您直接输出了一条消息,说明“信用卡账户不能进行转账!”。这意味着您有意地让这个transfer方法不做任何实际的转账操作,而是直接通知用户信用卡账户不支持转账功能。

在实际应用中,这种设计可能是基于业务规则或安全考虑的。信用卡账户通常不允许直接转账到其他账户,因为信用卡的主要用途是消费和透支,而不是作为资金转移的工具。然而,具体是否允许转账还取决于具体的银行业务规则和系统设计。 

测试代码:
public class AccountManager{public static void main(String[] args){//创立两个用户Account account1=new Account("001","张三",1000);Account account2=new Account("002","李四",300);//分别存入500元account1.deposit(500);account2.deposit(500);//张三取出200元account1.withdraw(200);//张三给李四300元account1.transfer(account2,300);//显示余额System.out.println("张三的余额:"+account1.getBalance());System.out.println("李四的余额:"+account2.getBalance());//创建定期账户和信用卡账户进行操作FixedTermAccount count1=new FixedTermAccount("001","张三",3000,3);CreatitCardAccount count2=new CreatitCardAccount("002","李四",4000,10000);count1.withdraw(200);//测试count1取钱200元count1.withdraw(3000);//测试count1取钱3000元count1.deposit(5000);//测试count1存钱5000元count2.withdraw(12000);//测试count2取钱12000元count2.withdraw(20000);//测试count2取钱20000元count2.deposit(6000);//测试count2存钱6000元count2.withdraw(20000);//测试count2取钱20000元;}
}

四.收获:

1.知道两个文件可以配合运行;

2.获取时间;

3.第一次弄那么长的代码,得复现5次,好好学习一下java;

这篇关于java大作业(9)--实现银行基本操作(第一遍)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/914772

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三