第一题:
结果:
结果分析:
当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
这个特性实际上就是面向对象“多态”特性的具体表现。
如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
如果子类被当作父类使用,则通过子类访问的字段是父类的,在实际开发中,要避免在子类中定义与父类同名 的字段。
第二题:
用多态的方法模拟ATM操作流程。
多态编程有两种主要形式: (1)继承多态:示例程序使用的方法 (2)接口多态:使用接口代替抽象基类
package 实验八;
import java.util.Scanner;
public class ShowATM {
@SuppressWarnings("resource")public static void main(String[] args) { Scanner in=new Scanner(System.in);ATM atm=new ATM();int choose=0,num=0;String pw="";next:while(true){ System.out.println("是否进入账户(0否1是):");int kk=in.nextInt();if(kk==0) break;else if(kk!=1){ System.out.println("输入错误!");continue;}System.out.println("输入账户密码:");pw=in.next();if(atm.ifPass(pw)){ while(true){ showFace();choose=in.nextInt();switch(choose){ case 1:System.out.println("输入存款金额:");num=in.nextInt();atm.save(num);System.out.println("存款成功!");System.out.println("当前余额:"+atm.getRest()+"元");break;case 2:System.out.println("请选择:");int a[]={100,500,1000,1500,2000,5000};for(int i=0;i<a.length;i++)System.out.println((i+1)+"."+a[i]+"元");System.out.println("7.其他");int ch=in.nextInt();if(ch>=1&&ch<=6){ if(atm.withdraw(a[ch-1]))System.out.println("取款成功!");elseSystem.out.println("余额不足!");}else if(ch==7){ System.out.println("请输入取款金额:");num=in.nextInt();if(atm.withdraw(num))System.out.println("取款成功!");else System.out.println("余额不足!");}else System.out.println("输入有误!");System.out.println("当前余额:"+atm.getRest()+"元");break;case 3:System.out.println("账户号:");String s=in.next();System.out.println("转账金额:");int i=in.nextInt();if(atm.transfer(s, i))System.out.println("转账成功!");elseSystem.out.println("转账失败!");System.out.println("当前余额:"+atm.getRest()+"元");break;case 4:System.out.println("输入六位数密码:");String p=in.next();atm.setPassword(p);break;case 5:System.out.println("当前余额:"+atm.getRest()+"元");break;default:continue next;}}}elseSystem.out.println("密码错误!");}}//显示菜单方法public static void showFace(){ System.out.println("********************");System.out.println(" 1.存款:");System.out.println(" 2.取款:");System.out.println(" 3.转账汇款:");System.out.println(" 4.修改密码:");System.out.println(" 5.查询余额:");System.out.println(" 6.退卡:");System.out.println("********************");System.out.println("请选择:");}}class PersonalAccount{
private String passWord="123456";@SuppressWarnings("unused")private String number;//银行卡号private int money=0;public int getMoney(){return money;}public void setPw(String s){passWord=s;}public void addMoney(int x){money+=x;}public void minusMoney(int x){money-=x;}public boolean whetherPwTrue(String s){ if(s.equals(passWord))return true;else return false;}}abstract class PATM{ public abstract boolean withdraw(int x);public abstract void save(int x);public abstract boolean transfer(String s,int x);public abstract boolean ifPass(String s);public abstract int getRest();public abstract void setPassword(String s);//设置密码}class ATM extends PATM{ private String numbers[]={"6227000000000000071","6227000000000000072","6227000000000000073","6227000000000000074"};private PersonalAccount account=new PersonalAccount();public boolean withdraw(int x) { if(x>account.getMoney())return false;else{ account.minusMoney(x);return true;}}public void save(int x) { account.addMoney(x);}public boolean transfer(String s, int x) {boolean flag=false;
for(int i=0;i<numbers.length;i++)if(s.equals(numbers[i])) flag=true;if(x>account.getMoney()) flag=false;if(x<=account.getMoney()&&flag) account.minusMoney(x);;return flag;}public boolean ifPass(String s) { return account.whetherPwTrue(s);}public int getRest() { return account.getMoney();}public void setPassword(String s) { account.setPw(s); }}