多态

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

Object obj="Hello";

if(obj instanceof String)

       System.out.println("obj对象可以被转换为字符串");

 

 

 

 

2.下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么?

       m=d;

       d=m;

       d=(Dog)m;

       d=c;

       c=(Cat)m;

先进行自我判断,得出结论后,运行TestCast.java实例代码,看看你的判断是否正确。

编译错误

 

d=m;d=c;

 

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

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

其语法是:子类对象变量=(子类名)基类对象名;

 

 

3. 运行代码

 

public class ParentChildTest {

       public static void main(String[] args) {

              Parent parent=new Parent();

              parent.printValue();

              Child child=new Child();

              child.printValue();

             

              parent=child;

              parent.printValue();

             

              parent.myValue++;

              parent.printValue();

             

              ((Child)parent).myValue++;

              parent.printValue();

             

       }

}

 

class Parent{

       public int myValue=100;

       public void printValue() {

              System.out.println("Parent.printValue(),myValue="+myValue);

       }

}

class Child extends Parent{

       public int myValue=200;

       public void printValue() {

              System.out.println("Child.printValue(),myValue="+myValue);

       }

}

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

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

3.   计算机是不会出错的,之所以得

       到这样的运行结果也是有原因的,

       那么从这些运行结果中,你能总

       结出Java的哪些语法特性?

       结果:

 

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

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

如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。

如果子类被当作父类使用,则通过子类访问的字段是父类的!

 

4.多态ATM

源代码:

//ATM模拟

//HanZhao 2016.11.15

 

import java.util.*;

 

abstract class Qukuan{

     abstract public void quKuan(int c,double m,String[][] user);

}

//账户登陆

class ZhangHu{

    

     public ZhangHu(){

           

     }

    

     public void show(){

            System.out.println("请输入你的账户名:"+" "+"【0退出】");

            Scanner str1=new Scanner(System.in);

            String ID=str1.nextLine();

           

            if(ID.equals(0)){

                   System.out.println("谢谢使用");

                   System.exit(0);

            }

           

            else

            {

                   System.out.println("请输入您的账户密码:");

                   Scanner str2=new Scanner(System.in);

                   String mima=str2.nextLine();

                  

                   hedui a=new hedui();

                   a.check(ID,mima);//检查是否正确

            }

           

           

     }

}

 

 

 

class User extends Qukuan{

     //用户操作选项

            public void show()

            {

            System.out.println("自动提款机用户操作界面");

            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("退卡---0");

            System.out.println("---------");

            System.out.println("请输入你的操作:");

           

        }

           

            //存款方法(当前账号的下标,存款金额,账户信息数组)

            public void cunKuan(int c,double m,String[][] user)

            {

          if((m%100)==0&&m>=0){

               user[c][3]=Double.toString(Double.parseDouble(user[c][3])+m);

               System.out.println("存款操作成功!");

             }

          else

           {System.out.println("请输入100的整数倍或请输入正数!");return;}

            }

           

           

            //取款方法)

            public void quKuan(int c,double m,String[][] user)

            {

                   if((m%100)==0&&m>=0){

                   if((Double.parseDouble(user[c][3])-m)>=0)

                   {

                 user[c][3]=Double.toString(Double.parseDouble(user[c][3])-m);

                 System.out.println("取款操作成功!");

                   }

                   else{System.out.println("余额不足,取款失败!");}

                   }

             else

           {System.out.println("请输入100的整数倍或请输入正数!");return;}

            }

           

           

           

            //查询余额方法

            public void yuE(int c,String[][] user)

            {

            System.out.println("账户名:"+user[c][0]+"  ID:"+user[c][1]+"  "+"余额为:"+user[c][3]+"元");

            }

           

           

         //转账方法(当前账下标,目标账号下标,转账金额,账户信息数组)

            public void zhuanZhang(int c,int s,double m,String[][] user)

            {

                   if((Double.parseDouble(user[c][3])-m)>=0&&m>=0)

                   {

                 user[c][3]=Double.toString(Double.parseDouble(user[c][3])-m);

                    user[s][3]=Double.toString(Double.parseDouble(user[s][3])+m);

                    System.out.println("转账操作成功!");

                   }

                else{System.out.println("余额不足,转账失败或请输入正数!");}

            }

             

           

             public void panDuan(int p,int i2,String[][] user)

            {

          switch(p)

                   {

                 case 1:{

                           System.out.println("请输入存款数:");

                           Scanner ck1 =new Scanner(System.in);

                     Double ck=ck1.nextDouble();

                           this.cunKuan(i2,ck,user);

                           break;

                           }

                    case 2:{

                           System.out.println("请输入取款数:");

                           Scanner qk1 =new Scanner(System.in);

                     Double qk=qk1.nextDouble();

                           this.quKuan(i2,qk,user);

                           break;

                           }

                    case 3:{

                           this.yuE(i2,user);

                           break;

                        }

              case 4:{

                   System.out.println("请输入目标账号ID:");

                           Scanner zhh =new Scanner(System.in);

                     String zh=zhh.nextLine();

                           for(int j=0;j<user.length;j++)

                     {

                        if(user[j][1].equals(zh))

                         {

                         System.out.println("请输入转入金额:");

                            Scanner zje =new Scanner(System.in);

                      Double zj=zje.nextDouble();

                   this.zhuanZhang(i2,j,zj,user);

                   return;

                      }

                     }

                           System.out.println("目标账户不存在,请核对信息!");

                           return;

                      }

             

              case 5:{

                           System.out.println("请输入修改密码的账户:");

                           Scanner zhh =new Scanner(System.in);

                     String zh=zhh.nextLine();

                     for(int j=0;j<user.length;j++)

                     {

                        if(user[j][1].equals(zh))

                         {

                         System.out.println("请输入新密码:");

                            Scanner zje =new Scanner(System.in);

                      String zj=zje.nextLine();

                   user[j][2]=zj;

                   System.out.println("修改成功");

                            return;

                      }

                     }

                           System.out.println("目标账户不存在,请核对信息!");

                           return;

                    

                    }

                    case 0:{System.exit(0);break;}

                    default:{System.out.println("请输入0~5的操作选项!");}

                }

         }

 

           

}

 

class hedui{

     String[][] user={{"zhaohan","20153195","153195","666"},{"luyibo","20143195","143195","1000"}};

    

     public void check(String str1,String str2){

            for(int i=0;i<user.length;i++){

                   while(user[i][1].equals(str1)&&user[i][2].equals(str2))

                   {

                          User a=new User();

                          a.show();

                         

                          Scanner str=new Scanner(System.in);

                          int xuanze=str.nextInt();

                          a.panDuan(xuanze, i, user);

                   }

                  

            }

           

 

     }    

}

    

public class bank{   

     public static void main(String[] args) {

            // TODO 自动生成的方法存根

            ZhangHu s=new ZhangHu();

            s.show();

 

     }

 

}

posted @ 2016-11-18 22:56  1503赵晗  阅读(147)  评论(0)    收藏  举报