• 动手动脑(多态)


    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=100;

        public void printValue() {

            System.out.println("Parent.printValue(),myValue="+myValue);

        }

    }

    class Child extends Parent{

        public int myValue=200;

        public void printValue() {

            System.out.println("Child.printValue(),myValue="+myValue);

        }

    }

    结果:

    分析:

       第一个new的parent类的对象,所以在调用时调用的是parent的构造方法以及parent的value值第二个new的child的类的对象,所以在调用构造方法时调用child的构造方法以及child的value值。第三个是将子类的child赋值给了他的父类parent,在调用构造方法时也就是调用子类child的构造方法,但是在子类的构造方法时的value是子类child的value值,所以是子类child的构造方法加上value=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是同一级,同为子类,不能相互赋值。

  • 相关阅读:
    2019牛客暑期多校训练营(第三场)B题、H题
    2019牛客暑期多校训练营(第四场)k题、j题
    Manacher算法 & Palindrome
    HDU 3336——Count the string
    判断一个点是否在三角形内
    P1052 过河
    P1353 [USACO08JAN]跑步Running
    hdu 1686 Oulipo
    Cyclic Nacklace HDU
    高精地图技术分析
  • 原文地址:https://www.cnblogs.com/sunqw/p/6079221.html
Copyright © 2020-2023  润新知