Java 多态
Posted 遗风遗风丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 多态相关的知识,希望对你有一定的参考价值。
一、多态.类型转换
1 class Mammal{} 2 class Dog extends Mammal {} 3 class Cat extends Mammal{} 4 5 public class TestCast 6 { 7 @SuppressWarnings("unused") 8 public static void main(String args[]) 9 { 10 Mammal m; 11 Dog d=new Dog(); 12 Cat c=new Cat(); 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 class ParentChildTest { 2 public static void main(String[] args) { 3 Parent parent=new Parent(); 4 parent.printValue(); 5 Child child=new Child(); 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 class Parent{ 21 public int myValue=100; 22 public void printValue() { 23 System.out.println("Parent.printValue(),myValue="+myValue); 24 } 25 } 26 class Child extends Parent{ 27 public int myValue=200; 28 public void printValue() { 29 System.out.println("Child.printValue(),myValue="+myValue); 30 } 31 }
总结:当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调 用子类型的方法,是父类型的,它就调用父类型的方法。 这个特性实际上就是面向对象“多态”特性的具体表现。如果子类与父类有相同的字段,则子类中的字段会代替或 隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。 如 果子类被当作父类使用,则通过子类访问的字段是父类的!
二、怎样判断对象是否可以转换
1 public class TestInstanceof 2 { 3 @SuppressWarnings("unused") 4 public static void main(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 instanceof Object)); 11 //返回true。 12 System.out.println("字符串是否是String类的实例:" + (hello instanceof String)); 13 //返回false。 14 System.out.println("字符串是否是Math类的实例:" + (hello instanceof Math)); 15 //String实现了Comparable接口,所以返回true。 16 System.out.println("字符串是否是Comparable接口的实例:" + (hello instanceof Comparable)); 17 String a = "Hello"; 18 //String类既不是Math类,也不是Math类的父类,所以下面代码编译无法通过 19 //System.out.println("字符串是否是Math类的实例:" + (a instanceof Math)); 20 } 21 }
三、TestPolymorphism.java
1 class Parent01 2 3 { 4 public int value=100; 5 public void Introduce(){ 6 System.out.println("I\'m father"); 7 } 8 } 9 class Son extends Parent01 10 { 11 public int value=101; 12 public void Introduce(){ 13 System.out.println("I\'m son"); 14 } 15 } 16 class Daughter extends Parent01 17 { 18 public int value=102; 19 public void Introduce(){ 20 System.out.println("I\'m daughter"); 21 } 22 } 23 public class TestPolymorphism 24 { 25 public static void main(String args[]){ 26 Parent01 p=new Parent01(); 27 p.Introduce(); 28 System.out.println(p.value); 29 p=new Son(); 30 p.Introduce(); 31 System.out.println(p.value); 32 p=new Daughter(); 33 p.Introduce(); 34 System.out.println(p.value); 35 } 36 }
四、多态的方法模拟ATM操作流程
1 import java.util.*; 2 public class ShowATM { 3 @SuppressWarnings("resource") 4 public static void main(String[] args) { 5 Scanner in=new Scanner(System.in); 6 ATM atm=new ATM(); 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<a.length;i++) 35 System.out.println((i+1)+"."+a[i]+"元"); 36 System.out.println("7.其他"); 37 int ch=in.nextInt(); 38 if(ch>=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 continue next; 77 } 78 } 79 } 80 else 81 System.out.println("密码错误!"); 82 } 83 } 84 //显示菜单方法 85 public static void showFace(){ 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 class PersonalAccount{ 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 class PATM{ 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 extends PATM{ 122 private String numbers[]={"6227000000000000071","6227000000000000072", 123 "6227000000000000073","6227000000000000074"};//数据库中已有的账户卡号 124 private PersonalAccount account=new PersonalAccount(); 125 public boolean withdraw(int x) { 126 if(x>account.getMoney()) 127 return false; 128 else{ 129 account.minusMoney(x); 130 return true; 131 } 132 } 133 public void save(int x) { 134 account.addMoney(x); 135 } 136 public boolean transfer(String s, int x) { 137 //转账 138 //先判断转到账户号是否存在 139 //再判断余额是否足够 140 boolean flag=false; 141 for(int i=0;i<numbers.length;i++) 142 if(s.equals(numbers[i])) flag=true; 143 if(x>account.getMoney()) flag=false; 144 if(x<=account.getMoney()&&flag) account.minusMoney(x);; 145 return flag; 146 } 147 public boolean ifPass(String s) { 148 return account.whetherPwTrue(s); 149 } 150 public int getRest() { 151 return account.getMoney(); 152 } 153 public void setPassword(String s) { 154 account.setPw(s); 155 } 156 }
以上是关于Java 多态的主要内容,如果未能解决你的问题,请参考以下文章