java 堕胎_Java 多态

一、多态.类型转换

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 }

35a21579c07b00f81f29ef2a085fbb79.png

总结:当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调                 用子类型的方法,是父类型的,它就调用父类型的方法。 这个特性实际上就是面向对象“多态”特性的具体表现。如果子类与父类有相同的字段,则子类中的字段会代替或               隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用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 }

4d0598f414facdf2f590675fbd6b34ab.png

三、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 }

451af031355fc3213d8b51861e460f9b.png

四、多态的方法模拟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 }

5d651b7b8787f1c720f1b22141293bac.png

95faf3afc3b378439996105c28264d0a.png

e893ce62640306996d1e9b18b509dd34.png

e9b25aef9030b046ae2f6e985cebac21.png

4363b72ee70f8d8709f9c5acaa20d561.png

3911b4cce94051bfe057d13fbd1f7b3b.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值