多态
1.可以使用instanceof运算符判断一个对象是否可以转换为指定的类型:
Object obj="Hello";
if(obj instanceof String)
System.out.println("obj对象可以被转换为字符串");
2.下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么?
m=d;
d=m;
d=(Dog)m;
d=c;
c=(Cat)m;
先进行自我判断,得出结论后,运行TestCast.java实例代码,看看你的判断是否正确。
编译错误
d=m;d=c;
不正确 子类对象可以直接赋给基类变量。
基类对象要赋给子类对象变量,必须执行类型转换,
其语法是:子类对象变量=(子类名)基类对象名;
3. 运行代码
public class ParentChildTest {
public static void main(String[] args) {
Parent parent=new Parent();
parent.printValue();
Child child=new Child();
child.printValue();
parent=child;
parent.printValue();
parent.myValue++;
parent.printValue();
((Child)parent).myValue++;
parent.printValue();
}
}
class Parent{
public int myValue=100;
public void printValue() {
System.out.println("Parent.printValue(),myValue="+myValue);
}
}
class Child extends Parent{
public int myValue=200;
public void printValue() {
System.out.println("Child.printValue(),myValue="+myValue);
}
}
1. 左边的程序运行结果是什么?
2. 你如何解释会得到这样的输出?
3. 计算机是不会出错的,之所以得
到这样的运行结果也是有原因的,
那么从这些运行结果中,你能总
结出Java的哪些语法特性?
结果:
原因:当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
这个特性实际上就是面向对象“多态”特性的具体表现。
如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
如果子类被当作父类使用,则通过子类访问的字段是父类的!
4.多态ATM
源代码:
//ATM模拟
//HanZhao 2016.11.15
import java.util.*;
abstract class Qukuan{
abstract public void quKuan(int c,double m,String[][] user);
}
//账户登陆
class ZhangHu{
public ZhangHu(){
}
public void show(){
System.out.println("请输入你的账户名:"+" "+"【0退出】");
Scanner str1=new Scanner(System.in);
String ID=str1.nextLine();
if(ID.equals(0)){
System.out.println("谢谢使用");
System.exit(0);
}
else
{
System.out.println("请输入您的账户密码:");
Scanner str2=new Scanner(System.in);
String mima=str2.nextLine();
hedui a=new hedui();
a.check(ID,mima);//检查是否正确
}
}
}
class User extends Qukuan{
//用户操作选项
public void show()
{
System.out.println("自动提款机用户操作界面");
System.out.println("---------");
System.out.println("存款---1");
System.out.println("取款---2");
System.out.println("余额---3");
System.out.println("转账---4");
System.out.println("修改密码---5");
System.out.println("退卡---0");
System.out.println("---------");
System.out.println("请输入你的操作:");
}
//存款方法(当前账号的下标,存款金额,账户信息数组)
public void cunKuan(int c,double m,String[][] user)
{
if((m%100)==0&&m>=0){
user[c][3]=Double.toString(Double.parseDouble(user[c][3])+m);
System.out.println("存款操作成功!");
}
else
{System.out.println("请输入100的整数倍或请输入正数!");return;}
}
//取款方法)
public void quKuan(int c,double m,String[][] user)
{
if((m%100)==0&&m>=0){
if((Double.parseDouble(user[c][3])-m)>=0)
{
user[c][3]=Double.toString(Double.parseDouble(user[c][3])-m);
System.out.println("取款操作成功!");
}
else{System.out.println("余额不足,取款失败!");}
}
else
{System.out.println("请输入100的整数倍或请输入正数!");return;}
}
//查询余额方法
public void yuE(int c,String[][] user)
{
System.out.println("账户名:"+user[c][0]+" ID:"+user[c][1]+" "+"余额为:"+user[c][3]+"元");
}
//转账方法(当前账下标,目标账号下标,转账金额,账户信息数组)
public void zhuanZhang(int c,int s,double m,String[][] user)
{
if((Double.parseDouble(user[c][3])-m)>=0&&m>=0)
{
user[c][3]=Double.toString(Double.parseDouble(user[c][3])-m);
user[s][3]=Double.toString(Double.parseDouble(user[s][3])+m);
System.out.println("转账操作成功!");
}
else{System.out.println("余额不足,转账失败或请输入正数!");}
}
public void panDuan(int p,int i2,String[][] user)
{
switch(p)
{
case 1:{
System.out.println("请输入存款数:");
Scanner ck1 =new Scanner(System.in);
Double ck=ck1.nextDouble();
this.cunKuan(i2,ck,user);
break;
}
case 2:{
System.out.println("请输入取款数:");
Scanner qk1 =new Scanner(System.in);
Double qk=qk1.nextDouble();
this.quKuan(i2,qk,user);
break;
}
case 3:{
this.yuE(i2,user);
break;
}
case 4:{
System.out.println("请输入目标账号ID:");
Scanner zhh =new Scanner(System.in);
String zh=zhh.nextLine();
for(int j=0;j<user.length;j++)
{
if(user[j][1].equals(zh))
{
System.out.println("请输入转入金额:");
Scanner zje =new Scanner(System.in);
Double zj=zje.nextDouble();
this.zhuanZhang(i2,j,zj,user);
return;
}
}
System.out.println("目标账户不存在,请核对信息!");
return;
}
case 5:{
System.out.println("请输入修改密码的账户:");
Scanner zhh =new Scanner(System.in);
String zh=zhh.nextLine();
for(int j=0;j<user.length;j++)
{
if(user[j][1].equals(zh))
{
System.out.println("请输入新密码:");
Scanner zje =new Scanner(System.in);
String zj=zje.nextLine();
user[j][2]=zj;
System.out.println("修改成功");
return;
}
}
System.out.println("目标账户不存在,请核对信息!");
return;
}
case 0:{System.exit(0);break;}
default:{System.out.println("请输入0~5的操作选项!");}
}
}
}
class hedui{
String[][] user={{"zhaohan","20153195","153195","666"},{"luyibo","20143195","143195","1000"}};
public void check(String str1,String str2){
for(int i=0;i<user.length;i++){
while(user[i][1].equals(str1)&&user[i][2].equals(str2))
{
User a=new User();
a.show();
Scanner str=new Scanner(System.in);
int xuanze=str.nextInt();
a.panDuan(xuanze, i, user);
}
}
}
}
public class bank{
public static void main(String[] args) {
// TODO 自动生成的方法存根
ZhangHu s=new ZhangHu();
s.show();
}
}

浙公网安备 33010602011771号