java复习笔记-04
回顾前几次复习,java的主要内容:面向对象思想,java编程语言,jvm和类文件格式,api。面向对象思想主要内容:uml工具(统一建模语言):针对面向对象思想的图,便于做项目等面向对象思想的程序时交流。类似货币的存在。面向对象的特性:封装,继承,多态。
概念性的东西学的够多了,该来点实际的了。
面向对象的封装:将对象的内容隐藏起来让外界只能通过他的方法才能访问。
这里直接从面向对象过渡到了java编程语言结合到了一起。
user类:
解释:这个类就用了面向对象封装的思想,我们可以注意到类中属性卡号身份证号等前面都用了访问修饰符private。使得这些属性都只能再本类直接访问。外界要使用,就要用到我设置的set/get方法。有了这些方法就可以进行一些安全设置。这些属性就不会轻易被更改。
package homework; /** * @author lh *以下是封装的实例: *target:实现银行的功能 *实现银行需要实现的类:用户,账户——类图,对象图 *功能:银行类要实现的功能-》初始化用户,用户登录,显示菜单,存款,取款,转账, *查询余额,修改密码,退出。 * 用例图,状态图,顺序图,部署图 * 状态图; * 初始化用户 * 用户登录 * 显示菜单 * 存取查改(其实就是数据库的增删改查) */ public class User { //卡号 private String cardNo; //身份证号 private String identity; //用户名 private String username; //密码 private String password; //电话 private String phone; //余额 private double balance; public User() { // 构造函数 } public User(String cardNo, String identity, String username, String password, String phone, double balance) { super(); this.cardNo = cardNo; this.identity = identity; this.username = username; this.password = password; this.phone = phone; this.balance = balance; } @Override public String toString() { return "User [cardNo=" + cardNo + ", identity=" + identity + ", username=" + username + ", password=" + password + ", phone=" + phone + ", balance=" + balance + "]"; } public String getCardNo() { return cardNo; } public void setCardNo(String cardNo) { this.cardNo = cardNo; } public String getIdentity() { return identity; } public void setIdentity(String identity) { this.identity = identity; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } }
bank类:
解释:写bank类时,要先初始化数据(这个之后加入数据库了就可以不用了),我可以选择直接写个方法,然后再在主方法里调用,这里直接把他放在构造方法里面了。这样一创建对象这些数据就会直接初始化,这一点涉及到类的周期问题。
package homework; import java.util.Scanner; /** * * @author Administrator *bank要实现的功能初始化,登录,显示菜单,增删改查,退出 */ public class Bank { //封装用户user private User[] users=new User[5]; int size=0;//初始化用户数量 public Bank() { initial(); } //初始化用户 public void initial() { User u1 = new User(); u1.setCardNo("73102210294844"); u1.setIdentity("1"); u1.setUsername("lh"); u1.setPassword("123456"); u1.setPhone("120"); u1.setBalance(1000); User u2 = new User("731232032583","2","hao","654321","110",2000); users[0]=u1; users[1]=u2; size=2; System.out.println("初始化成功"); } //登录功能 public void login() { Scanner sc = new Scanner(System.in); System.out.println("请输入用户名和密码:"); String user = sc.next(); String pad = sc.next(); for(int i=0;i<size;i++) { if(users[i].getUsername().equals(user)&&users[i].getPassword().equals(pad)) { //登录成功 Menu(users[i]); }else {//登录失败 System.out.println("登录失败"); } } } //显示页面界面 public void Menu(User u) { System.out.println("=====欢迎进入xx银行=="+u.getUsername()+"==="); do { System.out.println("1.存款 2.取款 3.转账 4.查询余额 5.修改密码 6.退出"); Scanner input = new Scanner(System.in); int i = input.nextInt(); switch (i) { case 1: deposit(u); break; case 2: withDraw(u); break; case 3: transfer(u); break; case 4: checkMoney(u); break; case 5: changPwd(u); break; case 6: return; default: break; } } while (true); } //存款 public void deposit(User u) { System.out.println("请输入存款金额"); Scanner sc = new Scanner(System.in); double cun = sc.nextDouble(); if(cun>0) { u.setBalance(u.getBalance()+cun); }else { System.out.println("输入错误"); } } //取款 public void withDraw(User u) { System.out.println("请输入取款金额"); Scanner sc = new Scanner(System.in); double qu = sc.nextDouble(); if(qu>0&&u.getBalance()>=qu) { u.setBalance(u.getBalance()-qu); }else { System.out.println("输入错误"); } } //转账 public void transfer(User u) { System.out.println("请输入目标账户和转账金额"); Scanner sc = new Scanner(System.in); String card = sc.next(); double money = sc.nextDouble(); if(money>0&&u.getBalance()>=money) { for(int i=0;i<size;i++) { if(users[i].getCardNo()==card) {//当确定了账户存在后 users[i].setBalance(users[i].getBalance()+money); u.setBalance(u.getBalance()-money); } } } } //查询余额 public void checkMoney(User u) { System.out.println("===当前用户"+u.getUsername()+"余额:"+u.getBalance()); } //修改密码 public void changPwd(User u) { System.out.println("请输入原密码:"); Scanner sc = new Scanner(System.in); String pwd = sc.next(); if(u.getPassword().equals(pwd)) { System.out.println("请输入新密码密码:"); Scanner sd = new Scanner(System.in); String rpwd = sd.next(); u.setPassword(rpwd); } } }
main方法:
package homework; public class MainFangFa { public static void main(String[] args) { Bank bank = new Bank(); bank.login(); } }
这个银行系统是网上学到的,目前最显眼的缺陷是退出后就会报错,我后期想完善一下,估计可以涉及到线程问题,比如存钱失败,钱的数值又加了上去这种问题,还有银行系统是不能出错的,应该还有很多值得学习的地方。
继承:父类抽取了子类共同的特征,子类继承他们就拥有了这些成员。但是有部分成员无法被继承=》构造方法(只负责构建本类对象,不可继承),无法访问到的成员(private修饰的属性和方法,父子类不在同一个package中,default修饰的属性和方法)
访问修饰符:
本类 | 同包 | 非同包 | 其他 | |
private | √ | x | x | x |
default | √ | √ | x | x |
protected | √ | √ | √ | x |
public | √ | √ | √ | √ |
重写:overrode 子类重写访问修饰符不能比父类更严。什么时候重写?在你觉得父类给的方法功能不够强大。
super:重写后的子类方法属性要用这个词加以区分。当你重写后发现又想用到父类的方法就用这个修饰符。注意super和this关键字必须写在第一行而且两者不能同时出现。
在具有继承关系的对象构建时,会先构造该对象的父类对象
好处:提高了代码的复用性,又提高了代码的可扩展性。
多态:父类产生多种子类,子类的多种形态即为多态。概念:父类引用指向子类对象,从而产生多种形态。Animal a=new Dog();
父类引用仅可调用父类所声明的属性和方法,不可调用子类独有的属性和方法。
如果子类中覆盖了父类中的方法,则优先执行覆盖后的方法。
多态的应用
场景一:使用父类作为方法形参实现多态,使方法参数的类型更为宽泛。
实参和形参:实参就是变量int i=0;形参就是对象dog i =new dog();
场景二:使用父类作为方法返回值实现多态,使方法可以返回不同子类对象。
向上转型和向下转型。向上只能用父类的类型和方法以及子类重写的方法。向下转型记得instanceof判断是否
为想要转换的类型。参数 instanceof 对象