多态(动手动脑)

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;
 }
 
}

程序截图:

时间: 2024-10-06 16:47:12

多态(动手动脑)的相关文章

java多态动手动脑

实验任务一:多态实现ATM工作原理 1)源代码: package demo; import java.util.Scanner; class A{ String name; String date; String mima; int yu; String kahao; public A(String name,String date,String mima,int yu,String kahao) { this.name=name; this.date=date; this.mima=mima;

第八章多态动手动脑

[动手动脑一] "类型转换"知识点考核-2 下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么? m=d; d=m; d=(Dog)m; d=c; c=(Cat)m; 先进行自我判断,得出结论后,运行TestCast.java实例代码,看看你的判断是否正确. class Mammal{} class Dog extends Mammal {} class Cat extends Mammal {} public class TestCast { public stat

继承多态动手动脑

[1] 为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来? 提示: 构造函数的主要作用是什么? 从这个方面去想! [答] 构造函数(constructor)是一种特殊的方法.主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载.构造函数的功能主要用于在类的对象创建时定义初始化的状态. 构造一个对象,先调用其构造方法

继承与多态 动手动脑

[1] 为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来? 提示: 构造函数的主要作用是什么? 从这个方面去想! [答] 构造函数(constructor)是一种特殊的方法.主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载.构造函数的功能主要用于在类的对象创建时定义初始化的状态. 构造一个对象,先调用其构造方法

03继承与多态 动手动脑

动手实验:继承条件下的构造方法调用 运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第一句,影响重大! class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String st

多态动手动脑

一.怎样判断对象是否可以转换?可以使用instanceof运算符判断一个对象是否可以转换为指定的类型,参看实例: TestInstanceof.java public class TestInstanceof { public static void main(String[] args) { //声明hello时使用Object类,则hello的编译类型是Object,Object是所有类的父类 //但hello变量的实际类型是String Object hello = "Hello"

继承与多态———动手动脑

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)pa

06-继承与多态-动手动脑

1.怎样判断对象是否可以转换? 答:可以使用instanceof判断一个对象是否可以转换为目标类型: 1 public class TestInstanceof 2 { 3 public static void main(String[] args) 4 { 5 //声明hello时使用Object类,则hello的编译类型是Object,Object是所有类的父类 6 //但hello变量的实际类型是String 7 Object hello = "Hello"; 8 //Strin

多态与异常------动手动脑

课堂动手动脑 1.    下面那个语句会引起编译错误? class Mammal{} class Dog extends Mammal {} class Cat extends Mammal{} public class TestCast { public static void main(String args[]) { Mammal m; Dog d=new Dog(); Cat c=new Cat(); m=d;//不会报错,子类的对象可以赋值给父类的引用 d=m;//会报错,父类的引用不

动手动脑之多态与异常处理

动手实验一:下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么? m=d; d=m; d=(Dog)m; d=c; c=(Cat)m; 先进行自我判断,得出结论后,运行TestCast.java实例代码,看看你的判断是否正确: java中基类对象不能当做子类对象使用,需要用强制转换来实现,子类对象变量=(子类名)基类对象名:错误的代码是d=m; d=c; 错误原因:类型不匹配:不能从 Mammal 转换为 Dog. 动手实验二:运行以下测试代码 上边的程序运行结果是什么?.你如