首页 > 代码库 > 08课堂问题整理

08课堂问题整理

作业归档8 多态

1、运行下列测试代码:

package demo;

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

}

}

运行结果:

字符串是否是Object类的实例:true

字符串是否是String类的实例:true

字符串是否是Math类的实例:false

字符串是否是Comparable接口的实例:true

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

2、运行下列测试代码:

package demo;

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;

d=(Dog)m;

//d=c;

//c=(Cat)m;

 

}

}

分析:

第一个注释掉的代码错误:Type mismatch: cannot convert from Mammal to Dog

第二个注释掉的代码错误:Type mismatch: cannot convert from Cat to Dog

第三个注释掉的代码错误:没有编译错误,但是无法运行。

3、运行下列测试代码:

package demo;

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=http://www.mamicode.com/100;

public void printValue() {

System.out.println("Parent.printValue(),myValue="http://www.mamicode.com/+myValue);

}

}

class Child extends Parent{

public int myValue=http://www.mamicode.com/200;

public void printValue() {

System.out.println("Child.printValue(),myValue="http://www.mamicode.com/+myValue);

}

}

程序运行结果是什么?

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

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

答:①运行结果:

Parent.printValue(),myValue=http://www.mamicode.com/100

Child.printValue(),myValue=http://www.mamicode.com/200

Child.printValue(),myValue=http://www.mamicode.com/200

Child.printValue(),myValue=http://www.mamicode.com/200

Child.printValue(),myValue=http://www.mamicode.com/201

②第一个,调用的是父类的方法,父类的属性。第二个,调用的是子类的方法与属性。然后,parent=child;后,parent.printValue()调用的将是子类的方法与属性。parent.myValue++;使得父类的属性加1100+1),parent.printValue();将与上一个调用相同,调用的是子类的方法与属性。之后,((Child)parent).myValue++;将父类的对象强制转化为子类的对象,并将属性加1200+1),parent.printValue();就会调用子类的方法属性。

③当子类与父类的方法一样时,并让父类对象引用子类对象时,调用哪个方法,对象的“真实”类型决定。如果子类与父类的字段相同,那么子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段。如果子类方法想访问父类中被隐藏的字段,需用关键字super来访问。如果子类被当作父类使用,则通过子类访问的字段是父类的。

4、运行下列测试代码:

package demo;

class Parent2   

{

public int value=http://www.mamicode.com/100;

    public void Introduce()

{

         System.out.println("I‘m father");

    }

}

 

class Son extends Parent2

{

public int value=http://www.mamicode.com/101;

    public void Introduce()

{

         System.out.println("I‘m son");

    }

}

class Daughter extends Parent2

{

public int value=http://www.mamicode.com/102;

public void Introduce()

{

         System.out.println("I‘m daughter");

    }

}

 

public class TestPolymorphism

{

    public static void main(String args[])

    {

        Parent2 p=new Parent2();

 

        p.Introduce();

 

        System.out.println(p.value);

 

        p=new Son();

 

        p.Introduce();

 

        System.out.println(p.value);

 

        p=new Daughter();

 

        p.Introduce();

 

        System.out.println(p.value);

    }

}

运行结果:

I‘m father

100

I‘m son

100

I‘m daughter

100

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

package demo;

 

import java.util.Scanner;

public class TestATM {

    public static void main(String []args){

     Account user=new Account("Marry","2016.11.15",1,"123456",500);

     Scanner cin=new Scanner(System.in);

     int choose;

     while(true){

     menu();

     choose=cin.nextInt();

     user.setType(choose);

     if(choose==1){

     user.saveMoney();

     }

     if(choose==2){

     user.drawMoney();

     }

     if(choose==3){

     user.zhuanMoney();

     }

     if(choose==4){

     user.updateMima();

     }

     if(choose==5){

     user.chaxun();

     }

     if(choose==6){

     break;

     }

     }

    }

    public static void menu(){

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

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

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

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

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

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

     System.out.println("请选择:");

    }

}

 

abstract class ATM{

abstract public void saveMoney();

abstract public void drawMoney();

abstract public void zhuanMoney();

abstract public void updateMima();

abstract public void chaxun();

}

class Account extends ATM{

private String name;//用户名

private String date;

private int type;

private String mima;//密码

private double money;

 

public Account(String na,String da,int ty,String mi,double mo){

name=na;

date=da;

type=ty;

mi=mima;

money=mo;

}

//set函数

public void setName(String na){

name=na;

}

public void setDate(String da){

date=da;

}

public void setType(int ty){

type=ty;

}

public void setMima(String mi){

mima=mi;

}

public void setMoney(double mo){

money=mo;

}

//get函数

public String getName(){

return name;

}

public String getDate(){

return date;

}

public int getType(){

return type;

}

public String getMima(){

return mima;

}

public double getMoney(){

return money;

}

//存款

public void saveMoney(){

Scanner cin1=new Scanner(System.in);

System.out.print("请输入存款的金额:");

double qian=cin1.nextDouble();

money+=qian;

System.out.println("存款成功,当前余额为:"+money);

}

//取款

public void drawMoney(){

Scanner cin2=new Scanner(System.in);

Scanner cin22=new Scanner(System.in);

System.out.print("请输入取款的金额:11002500310004150052000650007、其他");

int xuan=cin22.nextInt();

if(xuan==1){

if(money>=100){

money-=100;

System.out.println("取款成功,当前余额为:"+money);

}

else

System.out.println("抱歉,您的余额不足100元。");

}

 

if(xuan==2){

if(money>=500){

money-=500;

System.out.println("取款成功,当前余额为:"+money);

}

else

System.out.println("抱歉,您的余额不足500元。");

}

 

if(xuan==3){

if(money>=1000){

money-=1000;

System.out.println("取款成功,当前余额为:"+money);

}

else

System.out.println("抱歉,您的余额不足1000元。");

}

 

if(xuan==4){

if(money>=1500){

money-=1500;

System.out.println("取款成功,当前余额为:"+money);

}

else

System.out.println("抱歉,您的余额不足1500元。");

}

 

if(xuan==5){

if(money>=2000){

money-=2000;

System.out.println("取款成功,当前余额为:"+money);

}

else

System.out.println("抱歉,您的余额不足2000元。");

}

 

if(xuan==6){

if(money>=5000){

money-=5000;

System.out.println("取款成功,当前余额为:"+money);

}

else

System.out.println("抱歉,您的余额不足5000元。");

}

 

if(xuan==7){

double qian=cin2.nextDouble();

if(money<qian)

System.out.println("抱歉,您的余额不足"+qian+"元。");

else

    money-=qian;

System.out.println("取款成功,当前余额为:"+money);

}

 

}

//转账汇款

public void zhuanMoney(){

Scanner cin3=new Scanner(System.in);

Scanner input=new Scanner(System.in);

System.out.println("请输入对方账户:");

String toUser=input.nextLine();

System.out.print("请输入转账的金额:");

double qian=cin3.nextDouble();

if(money<qian)

System.out.println("抱歉,您的余额不足"+qian+"元。");

else

    money-=qian;

System.out.println("转账成功,当前余额为:"+money);

}

//

public void updateMima(){

Scanner sc=new Scanner(System.in);     

        //System.out.print("请输入原密码:");   

        //String oldMima = sc.nextLine();     

       // if(mima.equals(oldMima))

        //{

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

         String newMima1 = sc.nextLine();

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

         String newMima2 = sc.nextLine();

         if(newMima1.equals(newMima2)){

         mima=newMima1;

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

         }

         else

         System.out.println("两次新密码不一致,修改密码失败");

    // }

        //else{

         //System.out.println("原密码不正确,修改密码失败!");   

       // }

}

public void chaxun(){

System.out.println("您当前余额为:"+money);

}

}

运行结果:

1、存款

2、取款

3、转账汇款

4、修改密码

5、查询余额

6、退卡

请选择:

1

请输入存款的金额:5000

存款成功,当前余额为:5500.0

1、存款

2、取款

3、转账汇款

4、修改密码

5、查询余额

6、退卡

请选择:

2

请输入取款的金额:1、100。2、500。3、1000。4、1500。5、2000。6、5000。7、其他4

取款成功,当前余额为:4000.0

1、存款

2、取款

3、转账汇款

4、修改密码

5、查询余额

6、退卡

请选择:

3

请输入对方账户:

5968515154

请输入转账的金额:200

转账成功,当前余额为:3800.0

1、存款

2、取款

3、转账汇款

4、修改密码

5、查询余额

6、退卡

请选择:

4

请输入新密码:

569412

请再次输入新密码:

569412

修改密码成功

1、存款

2、取款

3、转账汇款

4、修改密码

5、查询余额

6、退卡

请选择:

5

您当前余额为:3800.0

1、存款

2、取款

3、转账汇款

4、修改密码

5、查询余额

6、退卡

请选择:

6

 

 

 

 

08课堂问题整理