首页 > 代码库 > 多态的课后总结

多态的课后总结

多态( polymorphism )的概念

相同的一条语句,在不同的运行环境中可以产生不同的运行结果。

多态的最本质特征就是父类(或接口)变量可以引用子类(或实现了接口的类)对象。换句话说:子类对象可以被当成基类对象使用!

 

Java中子类与基类变量间的赋值

子类对象可以直接赋给基类变量。

基类对象要赋给子类对象变量,必须执行类型转换,

其语法是:

       子类对象变量=(子类名)基类对象名;

也不能乱转换。如果类型转换失败Java会抛出以下这种异常:    ClassCastException

可以使用instanceof运算符判断一个对象是否可以转换为指定的类型:

技术分享

1.   左边的程序运行结果是什么?

2.   你如何解释会得到这样的输出?

3.   计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?

 

1.

Parent.printValue(),myValue=http://www.mamicode.com/100

Child.printValue(),myValue=http://www.mamicode.com/200

Child.printValue(),myValue=http://www.mamicode.com/200

Child.printValue(),myValue=http://www.mamicode.com/200

Child.printValue(),myValue=http://www.mamicode.com/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------------------");
    }
}

 

多态的课后总结