多态(动手动脑)

Posted 丹丹阳光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多态(动手动脑)相关的知识,希望对你有一定的参考价值。

1、可以使用instanceof运算符判断一个对象是否可以转换为指定的类型:
  Object obj="Hello";
  if(obj instanceof String)
  System.out.println("obj对象可以被转换为字符串");

程序代码:

package demo;

public class TestInstanceof {
 public static void main(String[] args){
  Object hello="Hello";
  System.out.println("字符串是否是Object类的实例:"+(hello instanceof Object));
  System.out.println("字符串是否是String类的实例:"+(hello instanceof String));
  System.out.println("字符串是否是Math类的实例:"+(hello instanceof Math));
  System.out.println("字符串是否是Comparable的实例:"+(hello instanceof Comparable));
  
  //String a="Hello";
  //System.out.println("字符串是否是Math类的实例:"+(a instanceof Math));
 }

}

程序截图:

2、运行以下测试代码:

1)左边的程序运行结果是什么?

2)你如何解释会得到这样的输出?

当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。

3) 计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总 结出Java的哪些语法特性?

如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
如果子类被当作父类使用,则通过子类访问的字段是父类的!

3、用多态的方法模拟ATM操作流程。

程序代码:
  

package demo;

import java.util.Date;
import java.util.Scanner;

public class ATMduotai {

 static Account user[] = new Account[10];
 static int dq = -1;
 static int n = 0;
 static Scanner scan = new Scanner(System.in);
 static char ch = \'y\';
 static atmfun p;
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  user[n++] = new Account("1001","liming","123456",20000.0);
  user[n++] =  new Account("1002","liSi","456",10000.0);
  int b;
  String id,passwd;
  boolean signin = false;
  System.out.println("请输入账户名:");
  id = scan.next();
  //登录操作
  for(int i = 0;i < n;i++){
   p = user[i];
   if(p.getId().equals(id))
   {
    System.out.println("请输入密码:");
    passwd = scan.next();
    if(p.getPasswd().equals(passwd))
    {
     signin = true;
     dq = i;
     break;
    }
    else
    {
     System.out.println("密码输入错误!卡已被锁定,无法操作");
     System.exit(0);
    }
    break;
   }
  }
  if(!signin)
  {
   System.out.println("无此用户名!");
   System.exit(0);
  }
  //public ATMuser(String aid,String aname,String apasswd,double ayue){
  while(ch == \'y\'){
   System.out.println("***********************ATM*************************");
   System.out.println("\\t\\t1、存款");
   System.out.println("\\t\\t2、取款");
   System.out.println("\\t\\t3、转账汇款");
   System.out.println("\\t\\t4、修改密码");
   System.out.println("\\t\\t5、查询余额");
   System.out.println("\\t\\t6、退出");
   System.out.println("***************************************************");
   b = scan.nextInt();
   switch(b){
   case 1:
   {
    cunKuan();break;
   }
   case 2:
   {
    quKuan();break;
   }
   case 3:
   {
    zhuanZhang();break;
   }
   case 4:
   {
    xiuGaipw();break;
   }
   case 5:
   {
    chaXunyue();break;
   }
   case 6:
   {
    ch = \'n\';
    break;
   }
   default:
    System.out.println("输入错误!");break;
   }
  }
 }
 
 static void cunKuan(){
  p = user[dq];
  double jine;
  System.out.println("请输入存款金额:");
  jine = scan.nextDouble();
  p.setYue(jine);
  p.setType("存款");
  p.setDate();
  System.out.println("时间:  " + p.getDate() + "\\t操作:" + p.getType());
  System.out.println("余额为: " + p.getYue());
 }
 
 static void quKuan(){
  p = user[dq];
  System.out.println("请选择取款金额:");
  System.out.println("1.100");
  System.out.println("2.500");
  System.out.println("3.1000");
  System.out.println("4.1500");
  System.out.println("5.2000");
  System.out.println("6.5000");
  System.out.println("7、其他金额");
  System.out.println("8、退卡");
  int b;
  b = scan.nextInt();
  double jine = 0;
  switch(b)
  {
  case 1:
   jine = 100;break;
  case 2:
   jine = 500;break;
  case 3:
   jine = 1000;break;
  case 4:
   jine = 1500;break;
  case 5:
   jine = 2000;break;
  case 6:
   jine = 5000;break;
  case 7:
  {
   System.out.println("请输入金额:");
   jine = scan.nextDouble();
   break;
  }
  case 8:
   ch = \'n\';break;
  }
  if(b != 8)
  {
   if(p.getYue() < jine)
    System.out.println("余额不足!");
   else{
    p.setYue(-jine);
    p.setType("取款");
    p.setDate();
    System.out.println("时间:  " + p.getDate() + "\\t操作:" + p.getType());
    System.out.println("余额为: " + p.getYue());
   }
  }
 }

 static void zhuanZhang(){
 
  String duifang;
  int df = -1;
  System.out.println("请输入对方账户:");
  duifang = scan.next();
  boolean cunzai = false;
  for(int i = 0;i < n;i++){
   p = user[i];
   if(p.getId().equals(duifang))
   {
    df = i;
    cunzai = true;
    break;
   }
  }
  if(!cunzai)
  {
   System.out.println("无此用户名!");
  }
  else
  {
   p = user[dq];
   double jine;
   System.out.println("请输入转账金额:");
   jine = scan.nextDouble();
   if(p.getYue() >= jine)
   {
    p.setYue(-jine);
    p.setType("转出");
    p.setDate();
    System.out.println("时间:  " + p.getDate() + "\\t操作:" + p.getType());
    System.out.println("余额为: " + p.getYue());
    p = user[df];
    p.setYue(jine);
    p.setType("转入");
    p.setDate();
    System.out.println("转账成功");
   }
   else
    System.out.println("余额不足");
     
  }

 }
 
 static void xiuGaipw(){
  p = user[dq];
  String a;
  System.out.println("请输入新密码:");
  a = scan.next();
  p.setPasswd(a);
  p.setType("修改密码");
  p.setDate();
  System.out.println("时间:  " + p.getDate() + "\\t操作:" + p.getType());
 }
 
 static void chaXunyue(){
  p = user[dq];
  System.out.println("余额为: " + p.getYue());
  p.setType("查询余额");
  p.setDate();
  System.out.println("时间:  " + p.getDate() + "\\t操作:" + p.getType());
 }
}

interface atmfun {
 void setId(String id);
 void setName(String name);
 void setPasswd(String passwd);
 void setYue(double yue);
 void setDate();
 void setType(String type);
 
 String getId();
 String getName();
 String getPasswd();
 double getYue();
 Date getDate();
 String getType();
}

class Account implements atmfun{
 String id;
 String name;
 String passwd;
 double yue = 0;
 Date date;
 String type;
 
 public Account(String aid,String aname,String apasswd,double ayue){
  name = aname;
  id = aid;
  passwd = apasswd;
  yue = ayue;
  setDate();
  setType("添加用户");
 }
 
 
 public void setId(String id){
  this.id = id;
 }
 public void setYue(double yue){
  this.yue += yue;
 }
 
 public void setName(String name){
  this.name = name;
 }
 
 public void setPasswd(String passwd){
  this.passwd = passwd;
 }
 
 public void setType(String type){
  this.type = type;
 }
 
 public void setDate(){
  date = new Date();
 }
 
 public String getId(){
  return id;
 }
 
 public String getName(){
  return name;
 }
 
 public String getPasswd(){
  return passwd;
 }
 
  public double getYue(){
  return yue;
 }
 
 public String getType() {
  return type;
 }
 
 public Date getDate(){
  return date;
 }
 
}

程序截图:

 


 

 

以上是关于多态(动手动脑)的主要内容,如果未能解决你的问题,请参考以下文章

java多态动手动脑

java动手动脑(多态)

java动手动脑多态

继承和多态之动手动脑

多态(动手动脑)

动手动脑(多态)