多态的课后总结
多态( polymorphism )的概念
相同的一条语句,在不同的运行环境中可以产生不同的运行结果。
多态的最本质特征就是父类(或接口)变量可以引用子类(或实现了接口的类)对象。换句话说:子类对象可以被当成基类对象使用!
Java中子类与基类变量间的赋值
子类对象可以直接赋给基类变量。
基类对象要赋给子类对象变量,必须执行类型转换,
其语法是:
子类对象变量=(子类名)基类对象名;
也不能乱转换。如果类型转换失败Java会抛出以下这种异常: ClassCastException
可以使用instanceof运算符判断一个对象是否可以转换为指定的类型:
1. 左边的程序运行结果是什么?
2. 你如何解释会得到这样的输出?
3. 计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?
1.
Parent.printValue(),myValue=100
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=201
2.第三个因为把子类赋给父类,所以调用的是子类方法,调用的也是子类的变量。
当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。实质是:方法的重写或方法的覆盖
3.如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
如果子类被当作父类使用,则通过子类访问的字段是父类的!
牢记:在实际开发中,要避免在子类中定义与父类同名 的字段。不要自找麻烦!
使用多态最大的好处是:
当你要修改程序并扩充系统时,你需要修改的地方较少,对其它部分代码的影响较小!千万不要小看这两个“较”字!程序规模越大,其优势就越突出。
用多态的方法模拟ATM操作流程。
package asdd; import java.util.Scanner; //模仿银行自助存取一体机(ATM) public class TestUser4 { public static int end=1; public static void main(String[] args) throws InterruptedException { String output=""; Command_Card comd[]=new Command_Card[5]; comd[0]=new Command_Card(1001,"张某","123456",1000); comd[1]=new Command_Card(1002,"李某","234561",2000); comd[2]=new Command_Card(1003,"王某","345671",3000); comd[3]=new Command_Card(1004,"刘某","456120",2000); comd[4]=new Command_Card(1005,"田某","561273",1500); while(true) { if(end==0) { System.out.println("谢谢使用,再见!"); return ; } output="请插入您的银行卡:\n"+"已插入卡,插入后请不要移动您的卡,谢谢配合!\n"+"正在识别请稍后"; System.out.println(output); for(int i=0;i<5;i++) { Thread.sleep(100); System.out.print("\t------>"); } System.out.println("\n卡识别正确,进入业务操作界面!"); int i; for(i=0;i<comd.length;i++) { boolean flag=comd[i].checkPassword(); if(flag) { System.out.println("密码正确:进入操作界面"); comd[i].operateing(); } } if(i==comd.length) { System.out.println("该用户不存在:"); } } } } class Account{ int id; String name; String password; double money; public Account(int id,String name,String password,double money) { this.id=id; this.name=name; this.password=password; this.money=money; } } class Command_Card extends Account{ public Command_Card(int id, String name, String password, double money) { super(id, name, password, money); } public String getpassword() { return this.password; } public int getId() { return this.id; } public boolean checkMoney(int m)//取款 { int i; for(i=0;i<5;i++){ if(m>money) { System.out.println("您的账户可用余额不够您的取款金额,请重新输入您的取款金额!"); System.out.print("请重新输入您的取款金额:"); Scanner scn2=new Scanner(System.in); m=scn2.nextInt(); } else { this.money-=m; System.out.println("恭喜您,取款成功!"); return true; } } if(i==5)return false; return false; } public boolean saveMoney(int m) { this.money+=m; System.out.println("恭喜您,存款成功!"); return true; } public boolean moveMoney(Account[] a,int m){ System.out.println("请输入汇款账户。"); Scanner scn3=new Scanner(System.in); int account=scn3.nextInt(); this.money-=m; for(int i = 0;i<a.length;i++){ if(a[i].id==account){ a[i].money+=m;System.out.println("恭喜您,转账成功!");} } return true; } public void search() { System.out.println("账号:"+this.id+",姓名:"+this.name+"当前可用余额:"+this.money+"元"); } public boolean checkPassword() { int i; System.out.println("请输入密码:"); for(i=0;i<3;i++) { Scanner scn=new Scanner(System.in); String passwords=scn.nextLine(); if(password.equals(passwords)) return true; else{ System.out.println("密码错误,请重新输入密码:");continue; } } if(i==3) { System.out.println("您已经输入密码错误超过3次,操作中断!"); } return false; } public void operateing() { menu(); Account comd[]=new Account[5]; comd[0]=new Account(1001,"张某","123456",1000); comd[1]=new Account(1002,"李某","234561",2000); comd[2]=new Account(1003,"王某","345671",3000); comd[3]=new Account(1004,"刘某","456120",2000); comd[4]=new Account(1005,"田某","561273",1500); Scanner scn=new Scanner(System.in); System.out.print("请输入你的选择(0-4):"); int chioce=scn.nextInt(); while(chioce!=0) { switch(chioce) { case 1: System.out.print("请输入存款金额:"); Scanner scn1=new Scanner(System.in); int money1=scn1.nextInt(); saveMoney(money1);break; case 2:System.out.print("请输入取款金额:"); Scanner scn2=new Scanner(System.in); int money2=scn2.nextInt(); checkMoney(money2);break; case 3:search();break; case 4:System.out.print("请输入取款金额:"); Scanner scn3=new Scanner(System.in); int money3=scn3.nextInt(); moveMoney(comd,money3); break; case 0:System.out.println("退出系统,请收好您的卡,再见!"); } menu(); System.out.print("请输入你的选择(0-4):"); scn=new Scanner(System.in); chioce=scn.nextInt(); } } public static void menu() { System.out.println("\t欢迎使用ATM自助银行服务,操作中请保管好您随身携带的物品及密码的安全!"); System.out.println("\t------------------"); System.out.println("\t[ 存款--1]"); System.out.println("\t[ 取款--2]"); System.out.println("\t[ 余额--3]"); System.out.println("\t[ 转账--4]"); System.out.println("\t[ 退卡--0]"); System.out.println("\t------------------"); } }