多态:相同的一条语句,在不同的运行环境中可以产生不同的运行结果。
子类对象可以直接赋给基类变量。
基类对象要赋给子类对象变量,必须执行类型转换,其语法是:
子类对象变量=(子类名)基类对象名;
一.动手动脑
1)源代码:
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 }
2)实验截图:
3)结果分析:
当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定。
这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
如果子类被当作父类使用,则通过子类访问的字段是父类的!
二.动手动脑 动物园(使用接口代替抽象基类)
1)源代码:
1 import java.util.Vector; 2 public class zoo4 { 3 public static void main(String[] args) { 4 Feeder f = new Feeder("小李"); 5 Vector<Animal> ans = new Vector<Animal>(); 6 7 //饲养员小李喂养一只狮子 8 ans.add(new Lion()); 9 //饲养员小李喂养十只猴子 10 for (int i = 0; i < 10; i++) { 11 ans.add(new Monkey()); 12 } 13 //饲养员小李喂养5只鸽子 14 for (int i = 0; i < 5; i++) { 15 ans.add(new Pigeon()); 16 } 17 18 f.feedAnimals(ans); 19 } 20 } 21 22 class Feeder {//饲养员类 23 public String name; 24 Feeder(String name) { 25 this.name = name; 26 } 27 public void feedAnimals(Vector<Animal> ans) { 28 for (Animal an : ans) { 29 an.eat(); 30 } 31 } 32 } 33 34 interface Animal {//动物基类 35 public abstract void eat(); 36 } 37 38 class Lion implements Animal {//狮子类 39 public void eat() { 40 System.out.println("我不吃肉谁敢吃肉!"); 41 } 42 } 43 44 class Monkey implements Animal {//猴子类 45 public void eat() { 46 System.out.println("我什么都吃,尤其喜欢香蕉。"); 47 } 48 } 49 50 class Pigeon implements Animal { 51 public void eat() { 52 System.out.println("我要减肥,所以每天只吃一点大米。"); 53 } 54 }
2)实验截图:
三.动手动脑
1)源代码:
1 //1115 2 import java.util.*; 3 public class Ex1115 { 4 5 public static void main(String[] args) { 6 Account a = new Account("11111111111","dsdf","20161115","256398",23.6); 7 a.jiemian(); 8 } 9 } 10 11 class Account 12 { 13 private static final String JOptionPane = null; 14 private static String Id; 15 private static String name; 16 private static String date; 17 private static String mima; 18 private static double extra; 19 20 Account(String i,String n,String d,String m,double e)//构造函数 21 { 22 Id=i; 23 name=n; 24 date=d; 25 mima=m; 26 extra=e; 27 } 28 29 public void set_Id(String i){ 30 Id=i; 31 } 32 public void set_name(String n){ 33 name=n;; 34 } 35 public void set_date(String d){ 36 date=d; 37 } 38 public void set_mima(String m){ 39 mima=m; 40 } 41 public void set_extra(double e){ 42 extra=e; 43 } 44 45 public String get_Id(){ 46 return Id; 47 } 48 public String get_name(){ 49 return name; 50 } 51 public String get_date(){ 52 return date; 53 } 54 public String get_mima(){ 55 return mima; 56 } 57 public double get_extra(){ 58 return extra; 59 } 60 61 62 public static void jiemian()//界面 63 { 64 System.out.println("请选择界面(1.中文2.英文):"); 65 Scanner sc=new Scanner(System.in); 66 String num1=sc.nextLine(); 67 int num11=Integer.parseInt(num1); 68 69 if(num11==1){ 70 71 Scanner sc1=new Scanner(System.in); 72 int num=Integer.parseInt(sc1.nextLine()); 73 74 while(true) 75 { 76 System.out.println("请选择要进行的操作:"); 77 System.out.println("1.取款"); 78 System.out.println("2.存款"); 79 System.out.println("3.转账"); 80 System.out.println("4.修改密码"); 81 System.out.println("5.查询余额"); 82 System.out.println("6.退卡"); 83 84 if(num==1) 85 qukuan(); 86 else if(num==2) 87 cunkuan(); 88 else if(num==3) 89 zhuan(); 90 else if(num==4) 91 xiugai(); 92 else if(num==5) 93 chaxun(); 94 else if(num==6){ 95 System.out.println("退卡成功!"); 96 } 97 } 98 } 99 100 else{ 101 102 } 103 104 } 105 106 public static void cunkuan()//存款 107 { 108 System.out.println("请输入存款金额:"); 109 Scanner sc = new Scanner(System.in); 110 int jine = Integer.parseInt(sc.nextLine()); 111 112 extra += jine; 113 System.out.println("您现在的金额为:" + extra); 114 } 115 116 public static void qukuan()//取款 117 { 118 System.out.println("请输入取款金额"); 119 String output=""; 120 output += "100 " 121 + " 500 " 122 + " 1000 " 123 + " 1500 " 124 + " 2000 " 125 + " 5000 " 126 + " 其他金额(请输入0)" 127 + " 返回操作(请输入-1) " 128 + " 退卡(请输入-2)"; 129 System.out.println(output); 130 131 Scanner sc=new Scanner(System.in); 132 int num=Integer.parseInt(sc.nextLine()); 133 134 switch(num) 135 { 136 case 100:{ 137 138 } 139 extra -= 100;break; 140 case 500: 141 extra -= 500;break; 142 case 1000: 143 extra -= 1000;break; 144 case 1500: 145 extra -= 1500;break; 146 case 2000: 147 extra -= 2000;break; 148 case 5000: 149 extra -= 5000;break; 150 case 0: 151 { 152 System.out.println("请输入取款金额:"); 153 Scanner sc1=new Scanner(System.in); 154 int jine=Integer.parseInt(sc1.nextLine()); 155 extra -= jine; 156 sc1.close(); 157 break; 158 } 159 case -1: 160 System.out.println("已返回操作界面");break; 161 case -2: 162 System.out.println("退卡成功!");break; 163 } 164 } 165 166 public static void zhuan()//转账汇款 167 { 168 System.out.println("请输入转账行号:"); 169 Scanner sc = new Scanner(System.in); 170 String hanghao = sc.nextLine(); 171 172 Scanner sc1 = new Scanner(System.in); 173 int jine = Integer.parseInt(sc1.nextLine()); 174 175 extra -= jine; 176 177 System.out.println("转账成功!"); 178 } 179 180 public static void xiugai()//修改密码 181 { 182 System.out.println("请输入要修改的密码:"); 183 Scanner sc1 = new Scanner(System.in); 184 String mi = sc1.nextLine(); 185 mima = mi; 186 } 187 188 public static void chaxun()//查询余额 189 { 190 System.out.println("余额为:"+extra); 191 } 192 193 }
2)结果截图: