多态

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

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

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

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);

}

}

原因分析:

当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。

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

改写:

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++;

System.out.println(parent.myValue);

System.out.println(child.myValue);

parent.printValue();

/*((Child)parent).myValue++;

System.out.println(parent.myValue);

System.out.println(child.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);

}

}用多态的方法实现ATM操作流程

import java.util.*; 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("是否进入账户(01是):"); 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[]={"3235635","3256894", "3265894","6589458"}; 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); } }

原文地址:https://www.cnblogs.com/keaidejava/p/6079198.html