首页 > 代码库 > 动手动脑(多态)

动手动脑(多态)

1.运行以下测试代码:

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

    }

}

结果:

技术分享

分析:

   第一个new的parent类的对象,所以在调用时调用的是parent的构造方法以及parent的value值第二个new的child的类的对象,所以在调用构造方法时调用child的构造方法以及child的value值。第三个是将子类的child赋值给了他的父类parent,在调用构造方法时也就是调用子类child的构造方法,但是在子类的构造方法时的value是子类child的value值,所以是子类child的构造方法加上value=http://www.mamicode.com/200。第四个是parent的value值加一,但是parent仍是前面的child赋过值的,所以调用的仍然是child的构造方法,value也是child中的value所以仍是200。第五个是将parent赋给child类,所以parent也是child的一部分,所以调用时是调用子类的构造方法,并且之前value值加1,所以输出201

 

2.用多态的方法模拟ATM操作流程

//课堂测试: ATM机

//Sun Qiwen,2016.11.15

 

import java.util.Scanner;

 

class ATM{

String biaoshi;

String name;

String Date;

int mima;

double yue;

public ATM(String a,String b,String c,int d,double e)

{

biaoshi=a;

name=b;

Date=c;

yue=e;

mima=d;

}

}

 

public class Account {

public static void main(String[] args) {

ATM acc=new ATM("abc12345678","sqw","2016.11.15",000000,100.0);

int mi,yu;

System.out.println("请选择语言:(1.中文 2.英文)");

Scanner in =new Scanner(System.in);

yu=in.nextInt();

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

Scanner in1 =new Scanner(System.in);

mi=in1.nextInt();

if(mi==acc.mima)

{

while(true)

{

int choose;

System.out.println("*************************");

System.out.println("**********ATM*************");

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("*************************");

Scanner in2 =new Scanner(System.in);

choose=in2.nextInt();

if(choose==1)

{

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

Scanner in3 =new Scanner(System.in);

double cun=in3.nextInt();

acc.yue=acc.yue+cun;

continue;

}

else if(choose==2)

{

System.out.println("取款金额有:1005001000150020005000、其他");

System.out.println("请输入取款金额:");

Scanner in4=new Scanner(System.in);

double qu=in4.nextDouble();

acc.yue=acc.yue-qu;

continue;

}

else if(choose==3)

{

System.out.println("请输入卡号:");

Scanner in6=new Scanner(System.in);

String hang=in6.nextLine();

if(hang.equals(acc.biaoshi))

{

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

    Scanner in5=new Scanner(System.in);

    double zhuan=in5.nextDouble();

    acc.yue=acc.yue-zhuan;

    }

}

else if(choose==4)

{

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

Scanner in7=new Scanner(System.in);

int mim=in7.nextInt();

if(mim==acc.mima)

{

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

Scanner in8=new Scanner(System.in);

int mim2=in8.nextInt();

acc.mima=mim2;

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

}

}

else if(choose==5)

{

System.out.println("您的余额为:"+acc.yue);

}

else System.out.println("无此功能!");

}

}

else System.out.println("此卡已经被锁定,无法操作!");

}

}

 

abstract class aATM{

    public abstract void QuKuan();             //取款

    public abstract void CunKuan();           //存款

    public abstract void Zhuanzhang();      //转账汇款

    public abstract void mima();               //修改密码

    public abstract void yue();                  //查询余额

}

结果:

技术分享

技术分享

技术分享

技术分享

技术分享

 

3.下列语句哪一个将引起编译错误为什么哪一个会引起运行时错误

 运行以下代码:

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;

    }

}

结果:

技术分享

分析:

d=m,d=c引发错误

因为d是dog的对象,m是Mammal的对象,所以这相当于直接将父类对象给子类要用强制类型转换,c,d是同一级,同为子类,不能相互赋值。

动手动脑(多态)