一、多态.类型转换
1 classMammal{}2 class Dog extendsMammal {}3 class Cat extendsMammal{}4
5 public classTestCast6 {7 @SuppressWarnings("unused")8 public static voidmain(String args[])9 {10 Mammal m;11 Dog d=newDog();12 Cat c=newCat();13 m=d;14 //d=m;
15 d=(Dog)m;16 //d=c;17 //c=(Cat)m;
18
19 }20 }
d=m; d=c; c=(Cat)m;这三句有错。再看另一段代码:
1 public classParentChildTest {2 public static voidmain(String[] args) {3 Parent parent=newParent();4 parent.printValue();5 Child child=newChild();6 child.printValue();7
8 parent=child;9 parent.printValue();10
11 parent.myValue++;12 parent.printValue();13
14 ((Child)parent).myValue++;15 parent.printValue();16
17 }18 }19
20 classParent{21 public int myValue=100;22 public voidprintValue() {23 System.out.println("Parent.printValue(),myValue="+myValue);24 }25 }26 class Child extendsParent{27 public int myValue=200;28 public voidprintValue() {29 System.out.println("Child.printValue(),myValue="+myValue);30 }31 }
总结:当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调 用子类型的方法,是父类型的,它就调用父类型的方法。 这个特性实际上就是面向对象“多态”特性的具体表现。如果子类与父类有相同的字段,则子类中的字段会代替或 隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。 如 果子类被当作父类使用,则通过子类访问的字段是父类的!
二、怎样判断对象是否可以转换
1 public classTestInstanceof2 {3 @SuppressWarnings("unused")4 public static voidmain(String[] args)5 {6 //声明hello时使用Object类,则hello的编译类型是Object,Object是所有类的父类7 //但hello变量的实际类型是String
8 Object hello = "Hello";9 //String是Object类的子类,所以返回true。
10 System.out.println("字符串是否是Object类的实例:" + (hello instanceofObject));11 //返回true。
12 System.out.println("字符串是否是String类的实例:" + (hello instanceofString));13 //返回false。
14 System.out.println("字符串是否是Math类的实例:" + (hello instanceofMath));15 //String实现了Comparable接口,所以返回true。
16 System.out.println("字符串是否是Comparable接口的实例:" + (hello instanceofComparable));17 String a = "Hello";18 //String类既不是Math类,也不是Math类的父类,所以下面代码编译无法通过19 //System.out.println("字符串是否是Math类的实例:" + (a instanceof Math));
20 }21 }
三、TestPolymorphism.java
1 classParent012
3 {4 public int value=100;5 public voidIntroduce(){6 System.out.println("I'm father");7 }8 }9 class Son extendsParent0110 {11 public int value=101;12 public voidIntroduce(){13 System.out.println("I'm son");14 }15 }16 class Daughter extendsParent0117 {18 public int value=102;19 public voidIntroduce(){20 System.out.println("I'm daughter");21 }22 }23 public classTestPolymorphism24 {25 public static voidmain(String args[]){26 Parent01 p=newParent01();27 p.Introduce();28 System.out.println(p.value);29 p=newSon();30 p.Introduce();31 System.out.println(p.value);32 p=newDaughter();33 p.Introduce();34 System.out.println(p.value);35 }36 }
四、多态的方法模拟ATM操作流程
1 import java.util.*;2 public classShowATM {3 @SuppressWarnings("resource")4 public static voidmain(String[] args) {5 Scanner in=newScanner(System.in);6 ATM atm=newATM();7 int choose=0,num=0;8 String pw="";9 next:while(true){10 System.out.println("是否进入账户(0否1是):");11 int kk=in.nextInt();12 if(kk==0) break;13 else if(kk!=1){14 System.out.println("输入错误!");15 continue;16 }17 System.out.println("输入账户密码:");18 pw=in.next();19 if(atm.ifPass(pw)){20 while(true){21 showFace();22 choose=in.nextInt();23 switch(choose){24 case 1:25 System.out.println("输入存款金额:");26 num=in.nextInt();27 atm.save(num);28 System.out.println("存款成功!");29 System.out.println("当前余额:"+atm.getRest()+"元");30 break;31 case 2:32 System.out.println("请选择:");33 int a[]={100,500,1000,1500,2000,5000};34 for(int i=0;i=1&&ch<=6){39 if(atm.withdraw(a[ch-1]))40 System.out.println("取款成功!");41 else
42 System.out.println("余额不足!");43 }44 else if(ch==7){45 System.out.println("请输入取款金额:");46 num=in.nextInt();47 if(atm.withdraw(num))48 System.out.println("取款成功!");49 else
50 System.out.println("余额不足!");51 }52 else
53 System.out.println("输入有误!");54 System.out.println("当前余额:"+atm.getRest()+"元");55 break;56 case 3:57 System.out.println("账户号:");58 String s=in.next();59 System.out.println("转账金额:");60 int i=in.nextInt();61 if(atm.transfer(s, i))62 System.out.println("转账成功!");63 else
64 System.out.println("转账失败!");65 System.out.println("当前余额:"+atm.getRest()+"元");66 break;67 case 4:68 System.out.println("输入六位数密码:");69 String p=in.next();70 atm.setPassword(p);71 break;72 case 5:73 System.out.println("当前余额:"+atm.getRest()+"元");74 break;75 default:76 continuenext;77 }78 }79 }80 else
81 System.out.println("密码错误!");82 }83 }84 //显示菜单方法
85 public static voidshowFace(){86 System.out.println("********************");87 System.out.println(" 1.存款:");88 System.out.println(" 2.取款:");89 System.out.println(" 3.转账汇款:");90 System.out.println(" 4.修改密码:");91 System.out.println(" 5.查询余额:");92 System.out.println(" 6.退卡:");93 System.out.println("********************");94 System.out.println("请选择:");95 }96 }97
98 classPersonalAccount{99 private String passWord="123456";//密码
100 @SuppressWarnings("unused")101 private String number;//银行卡号
102 private int money=0;103 public int getMoney(){return money;}//余额
104 public void setPw(String s){passWord=s;}//设置密码
105 public void addMoney(int x){money+=x;}//加钱
106 public void minusMoney(int x){money-=x;}//减钱
107 public boolean whetherPwTrue(String s){//密码是否正确
108 if(s.equals(passWord))109 return true;110 else return false;111 }112 }113 abstract classPATM{114 public abstract boolean withdraw(int x);//取款
115 public abstract void save(int x);//存款
116 public abstract boolean transfer(String s,int x);//转账
117 public abstract boolean ifPass(String s);//判断输入的密码是否正确
118 public abstract int getRest();//查询余额
119 public abstract void setPassword(String s);//设置密码
120 }121 class ATM extendsPATM{122 private String numbers[]={"6227000000000000071","6227000000000000072",123 "6227000000000000073","6227000000000000074"};//数据库中已有的账户卡号
124 private PersonalAccount account=newPersonalAccount();125 public boolean withdraw(intx) {126 if(x>account.getMoney())127 return false;128 else{129 account.minusMoney(x);130 return true;131 }132 }133 public void save(intx) {134 account.addMoney(x);135 }136 public boolean transfer(String s, intx) {137 //转账138 //先判断转到账户号是否存在139 //再判断余额是否足够
140 boolean flag=false;141 for(int i=0;iaccount.getMoney()) flag=false;144 if(x<=account.getMoney()&&flag) account.minusMoney(x);;145 returnflag;146 }147 public booleanifPass(String s) {148 returnaccount.whetherPwTrue(s);149 }150 public intgetRest() {151 returnaccount.getMoney();152 }153 public voidsetPassword(String s) {154 account.setPw(s);155 }156 }