Java课堂练习——多态

一.ATM

import java.util.Scanner;

abstract class drawmoney{

public abstract double getMoney(double a,double n);

}

class drawmoney100 extends drawmoney{

public double getMoney(double a,double n){

if(a<100){

System.out.println("余额不足,请选择其他业务");

return a;

}

else {

System.out.println("已吐出100元");

return a-=100;

}

}

}

class drawmoney500 extends drawmoney{

public double getMoney(double a,double n){

if(a<500){

System.out.println("余额不足,请选择其他业务");

return a;

}

else {

System.out.println("已吐出500元");

return a-=500;

}

}

}

class drawmoney1000 extends drawmoney{

public double getMoney(double a,double n){

if(a<1000){

System.out.println("余额不足,请选择其他业务");

return a;

}

else {

System.out.println("已吐出1000元");

return a-=1000;

}

}

}

class drawmoney1500 extends drawmoney{

public double getMoney(double a,double n){

if(a<1500){

System.out.println("余额不足,请选择其他业务");

            return a;

        }

        else {

         System.out.println("已吐出1000元");

         return a-=1000;

        }

}

}

class drawmoney2000 extends drawmoney{

public double getMoney(double a,double n){

if(a<2000){

System.out.println("余额不足,请选择其他业务");

return a;

}

else {

System.out.println("已吐2000元");

return a-=2000;

}

}

}

class drawmoney5000 extends drawmoney{

public double getMoney(double a,double n){

if(a<5000){

System.out.println("余额不足,请选择其他业务");

return a;

}

else {

System.out.println("已吐出5000元");

return a-=5000;

}

}

}

class drawmoneyn extends drawmoney{

public double getMoney(double a,double n){

if(a<n){

System.out.println("余额不足,请选择其他业务");

return a;

}

else {

System.out.println("已吐出"+n+"元");

return a-=n;

}

}

}

class Account{

String account;

    String usename;

    int password;

    String date;

    double balance;

    int Operation;

    public Account(){

     account="accout1805231593";

     usename="宋家林";

        password=521114;

        date="1997.8.11";

        balance=230.15;

        Operation=0;

    }

    public Account(String a,String b,int c,String d,double e,int f){

     account=a;

     usename=b;

     password=c;

     date=d;

     balance=e;

     Operation=f;

    }

}

 public class ATM {

 public Account h=new Account();

 }

 public boolean shurumina(int a){

 if(a==h.password) {

 System.out.println("密码正确");

 }

 else{

 System.out.println("密码错误,请重新输入");

 return false;

 }

public void jiemian(boolean a){

Scanner cin=new Scanner(System.in);

while(a){

System.out.println("1.存款");

System.out.println("2.取款");

System.out.println("3.转账汇款");

System.out.println("4.修改密码");

System.out.println("5.查询余额");

System.out.println("6.退卡");

int b=cin.nextInt();

switch (b){

case 1:deposit(b);break;

case 2:withdrawals(b);break;

case 3:transfer(b);break;

case 4:Passwordservice(b);break;

case 5:System.out.println(h.balance);break;

case 6:a=false;break;

}

}                      

 }

public int withdrawals(int a){

Scanner cin=new Scanner(System.in);

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=cin.nextInt();

double c=0;

drawmoney m=null;

switch (b){

case 1:m= new drawmoney100();m.getMoney(h.balance, b);break;

case 2:m= new drawmoney500();m.getMoney(h.balance, b);break;

case 3:m= new drawmoney1000();m.getMoney(h.balance, b);break;

case 4:m= new drawmoney1500();m.getMoney(h.balance, b);break;

case 5:m= new drawmoney2000();m.getMoney(h.balance, b);break;

case 6:m= new drawmoney5000();m.getMoney(h.balance, b);break;

case 7:{

System.out.println("输入金额");

c=cin.nextDouble();

m= new drawmoneyn();

m.getMoney(h.balance, c);break;

}

case 8: return a;}

                return a;

         }

        public int deposit(int a){

         System.out.println("放入人民币");

         System.out.println("输入金额");

         Scanner cin=new Scanner(System.in);

         int b=cin.nextInt();

         h.balance+=b;

         System.out.println("已成功");

         jiemian(true);

         return a;

         }

        public int transfer(int a){

         System.out.println("请输入银行账号");

         Scanner cin=new Scanner(System.in);

         String b=cin.next();

         System.out.println("输入转账的金额");

         int c=cin.nextInt();

         h.balance-=c;

         System.out.println("已成功");

         jiemian(true);

         return 0;

        }

        public int Passwordservice(int a){

         System.out.println("请输入新密码");

         Scanner cin=new Scanner(System.in);

         int b=cin.nextInt();

         h.password-=b;

         System.out.println("已成功");

         return 0;

        }

        public static void main(String[] args) {

         // TODO Auto-generated method stub

         ATM mm=new ATM();

         String out=new String();

         out+="请插入银行卡";

         System.out.println(out);

         System.out.println("已成功");

         out+="请输入密码";

         System.out.println(out);

         Scanner cin=new Scanner(System.in);

         int a=cin.nextInt();

         while (!mm.shurumina(a)){

         a=cin.nextInt();

         }

         mm.jiemian(true);

         }

}

二.

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

 

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

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

这个特性实际上就是面向对象多态特性的具体表现。

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

如果子类被当作父类使用,则通过子类访问的字段是父类的!

牢记:在实际开发中,要避免在子类中定义与父类同名 的字段。不要自找麻烦!——但考试除外,考试 中出这种题还是可以的。

.

可以使用instanceof运算符判断一个对象是否可以转换为指定的类型:

Object obj="Hello";if(obj instanceof String)

System.out.println("obj对象可以被转换为字符串");

程序代码:public class TestInstanceof {

public static void main(String[] args)

{

//声明hello时使用Object类,则hello的编译类型是ObjectObject是所有类的父类

//hello变量的实际类型是String

Object hello = "Hello";

//StringObject类的子类,所以返回true

System.out.println("字符串是否是Object类的实例:" + (hello instanceof Object));

//返回true

System.out.println("字符串是否是String类的实例:" + (hello instanceof String));

//返回false

System.out.println("字符串是否是Math类的实例:" + (hello instanceof Math));

//String实现了Comparable接口,所以返回true

System.out.println("字符串是否是Comparable接口的实例:" + (hello instanceof Comparable));

String a = "Hello";

//String类既不是Math类,也不是Math类的父类,所以下面代码编译无法通过

//System.out.println("字符串是否是Math类的实例:" + (a instanceof Math));

}

}

.为什么要用多态?它有什么好处?
使用多态最大的好处是:当你要修改程序并扩充系统时,你需要修改的地方较少,对其它部分代码的影响较小!千万不要小看这两个字!程序规模越大,其优势就越突出。

原文地址:https://www.cnblogs.com/qq1499632156/p/6079328.html