08-多态动手动脑及课后实践性问题总结
一.类型转换知识:下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么?
m=d;
d=m;
d=(Dog)m;
d=c;
c=(Cat)m;
下面语句中二、四个将引起编译错误,第二个错误是因为Type mismatch: cannot convert from Mammal to Dog,不能将动物类转换成狗类,第四个错误是因为Type mismatch: cannot convert from Cat to Dog,不能将同等地位的类进行转换。
二.运行以下测试代码:
1.左边的程序运行结果什么?
100 200 200 200 201
2.总结:
(1)当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的”真实“类型所决定,也就是说:对象是子类型的,它就调用子类型的方法,是父亲型的,它就调用父类型的方法。
(2)如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类的字段(而不是父类中的字段)。如果子类方法确定想访问父类中被隐藏的同名字段,可以用super关键字来访问它。如果子类被当作父类使用,则通过子类访问的字段是父亲的!
三.“多态小结”
多态编程有两种主要形式:
(1)继承多态:示例程序使用的方法
(2)接口多态:使用接口代替抽象基类,这个任务留为作业
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 }
四.多态实现ATM
import javax.swing.JOptionPane; import java.util.Scanner; class Account { String number;//十一个长度字符、数字的组合 String name; String Date; int code;//六位数,可以用0开头 double yue; public void set(String nu,String na,int c,double y) { number=nu; name=na; code=c; yue=y; } public Account() { // TODO Auto-generated constructor stub } public void cunkuan(int m)//存款 { yue=yue+m; } public void zhuanzhang(Account hanghao)//转账,参数为行号 { System.out.println("请输入转账金额:"); Scanner z=new Scanner(System.in); int zh=z.nextInt(); if(yue>=zh) { yue=yue-zh; System.out.println("转账成功!"); hanghao.yue=+zh; } else { System.out.println("余额不足!不能完成转账!"); } } public void qukuan(int n)//取款 { yue=yue-n; } } public class ATM { public static void main(String[] args) { // TODO Auto-generated method stub //用户插卡后 String a; String b,c; int a1,b1,c1; Account acc=new Account(); Account acc1=new Account(); acc.set("my123456789","张贺",202862, 1000); //插卡后用户界面,选择语言界面 a=JOptionPane.showInputDialog( "选择语言:(1.English;2.中文)"); a1 = Integer.parseInt(a); if(a1==1) { JOptionPane.showMessageDialog(null,"English", "选择语言", JOptionPane.PLAIN_MESSAGE ); } if(a1==2) { JOptionPane.showMessageDialog(null,"中文", "选择语言", JOptionPane.PLAIN_MESSAGE ); } //输入密码界面 b=JOptionPane.showInputDialog( "请输入密码:"); b1= Integer.parseInt(b); if(b1==acc.code) { JOptionPane.showMessageDialog(null,"成功登录!", "选择语言", JOptionPane.PLAIN_MESSAGE ); } else { JOptionPane.showMessageDialog(null,"该卡已被锁定!", "选择语言", JOptionPane.PLAIN_MESSAGE ); } c=JOptionPane.showInputDialog( "选择语言:(1.转账;2.取款;3.存款)"); c1 = Integer.parseInt(c); if(c1==1) { acc.zhuanzhang(acc1); } else if(c1==2) { int n = 0; acc.qukuan(n); } else if(c1==3) { int m = 0; acc.cunkuan(m); } } }