1>
请看以下“变态”的类(参看示例ParentChildTest.java)
上述代码的特点是: 子类和父类定义了一模一样的字段和方法
运行以下测试代码
1. 上边的程序运行结果是什么?
2. 你如何解释会得到这样的输出?
第一个100:是parent调用PrintValue方法输出parent类中myValue值为100;
第二个200:是child调用PrintValue方法输出child类中myValue值为200;
第三个200:是parent = child,将子类对象的赋值给父类,但此时parent只能调用子类的方法,调用子类PrintValue时,输出的当然是子类的myValue值200。
第四个200:虽然parent = child,但parent不能调用子类的变量,所以parent.myValue++;只是将父类对象中的变量myValue值+1但不能改变子类的myValue值,但调用的是子类PrintValue方法时,输出的是子类的myValue值200。
第五个201:(Child)parent,强制转化parent为child对象,此时parent完全成为child对象,所以输出值为201。
3. 计算机是不会出错的,之所以得到这样的运行结果也是有原因的, 那么从这些运行结果中,你能总 结出Java的哪些语法特性?
(1):当子类和父类拥有同名方法时,并且让一个父类变量引用一个子类对象时,调用哪个方法由自己的真实类型来决定。
(2):如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。
2>
用多态的方法模拟ATM操作流程。
import java.util.Scanner; abstract class atma{ public abstract void QuKuan(); public abstract void CunKuan(); public abstract void ZhuanZhang(); public abstract void updataMima(String str); public abstract void showMoney(); } public class ATM { public static void main(String[] args) { // TODO Auto-generated method stub Account A = new Account(); A.display(); } } class Account extends atma { String account; String name; String data; int leixing; String mima; double money; Account(){} Account(String account,String name,String data,String mima,double money) { this.account = account; this.name = name; this.data = data; this.mima = mima; this.money = money; } public String getMima() { return mima; } public void Mune() { System.out.println("1.取款"); System.out.println("2.存款"); System.out.println("3.转账汇款"); System.out.println("4.修改密码"); System.out.println("5.查询余额"); System.out.println("6.退卡"); } public void QuKuan() { System.out.println("100元"); System.out.println("500元"); System.out.println("1000元"); System.out.println("1500元"); System.out.println("2000元"); System.out.println("5000元"); System.out.println("其他金额"); System.out.println("返回"); Scanner in = new Scanner(System.in); System.out.println("请输入取款金额:"); int M = in.nextInt(); if(M <= money) { System.out.println("正在取款请稍后。。。"); money = money - M; System.out.println("取款成功!"); } else { System.out.println("余额不足,取款失败!"); } } public void CunKuan() { Scanner in = new Scanner(System.in); System.out.println("请输入存款金额:"); int M = in.nextInt(); money = money + M; System.out.println("存款成功!"); } public void ZhuanZhang() { Scanner in = new Scanner(System.in); System.out.println("请输入转账行号:"); String H = in.next(); System.out.println("你要转账的人的姓名是否为xxx?0:是,1:否"); int X=in.nextInt(); if(X==0) { System.out.println("请输入转账金额:"); int M = in.nextInt(); if(money >= M) { System.out.println("转账成功!"); money = money - M; } else { System.out.println("余额不足,转账失败!"); } } if(X==1) { System.out.println("卡号错误!"); } } public void updataMima(String str) { if(str.equals(mima)) { System.out.println("新密码不得与旧密码重复!"); } else { mima = str; System.out.println("修改成功!"); } } public void showMoney() { System.out.println("您的账户余额为:"+money); } public void display() { Scanner in = new Scanner(System.in); Account[] a = new Account[100]; a[0] = new Account("123456789101","ctt","2016/11/15","123456",1000); System.out.println( "请输入密码:" ); String input = in.next(); boolean flag = false; for(int i = 0;i<50;i++) { if(a[i].getMima().equals(input)&& a[i]!=null) flag = true; break; } int s1; if(flag) { boolean p = true; while(p) { Mune(); System.out.println( "请输入要执行的操作:" ); s1 = in.nextInt(); if(s1 == 1) { QuKuan(); continue; } if(s1 == 2) { CunKuan(); continue; } if(s1 == 3) { ZhuanZhang(); continue; } if(s1 == 4) { System.out.println("请输入新密码:"); String str = in.next(); updataMima(str); continue; } if(s1 == 5) { showMoney(); continue; } else { p = false; System.out.println("已退出!"); } } } else { System.out.println("输入错误!"); } } }
结果:
分析:利用抽象类实现。