首页 > 技术文章 > JAVA08 多态

gxt- 2016-11-18 14:13 原文

多态:相同的一条语句,在不同的运行环境中可以产生不同的运行结果。

子类对象可以直接赋给基类变量。
基类对象要赋给子类对象变量,必须执行类型转换,其语法是:
子类对象变量=(子类名)基类对象名;

一.动手动脑

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                 + "\n500 "
122                 + "\n1000  "
123                 + "\n1500 "
124                 + "\n2000 "
125                 + "\n5000  "
126                 + "\n其他金额(请输入0)"
127                 + "\n返回操作(请输入-1) "
128                 + "\n退卡(请输入-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)结果截图:

推荐阅读