• 第八次课后作业多态的一些问题


    第一题:

    结果:

    结果分析:

    当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。

    这个特性实际上就是面向对象“多态”特性的具体表现。

    如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用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("取款成功!");
    else
    System.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("转账成功!");
    else
    System.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;
    }
    }
    }
    else
    System.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);
    }
    }

  • 相关阅读:
    linux自动挂载
    VUE 封装 api类
    数据库中如何判断某参数为空就不执行where条件
    axios 拦截 , 页面跳转, token 验证(非本人原创)
    springboot 集成 WebSocket (非本人原创)
    spring cloud整合 websocket 的那些事
    前后端消息推送
    spring cloud 之eureka配置
    spring cloud 之demo
    linux 进程的 5 大段
  • 原文地址:https://www.cnblogs.com/ever1961211/p/6079077.html
Copyright © 2020-2023  润新知