多态

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

  代码:

    

 

         public class TestInstanceof

{

   public static void main(String[] args)

   {

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

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

      Object hello = "Hello";

      //String是Object类的子类,所以返回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));

   }

}

  结果截图:

  

  修改后的程序:

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

            

        Mammal m=null ;

                 Dog d=new Dog();

                 Cat c=new Cat();

                                     m=d;

                                     d=m;

                                      d=(Dog)m;

                                      d=c;

                                      c=(Cat)m;

  第二句和第三句会引起编译错误。原因:子类对象可以直接赋给基类变量。基类对象要赋给子类对象变量,必须执行类型转换,其语法是:子类对象变量=(子类名)基类对象名;第五句会引起运行错误。原因:转换混乱。

三.

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

    

  

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

  前两个都是parent和child分别调用的自己方法,输出自己的值。第三个parent引用子类child类的对象则调用child的方法。第四个是parent里面的Value加一,但是child里面的Value并没有加1还是调用child的方法,值不会变。第五个进行了类型转换,结果是child里面的Value+1输出结果为201

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

  总结:当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。

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

四. javap查看编译器为TestPolymorphism.java生成的字节码指令,然后通过互联网搜索资料,尝试从底层开始理解Java编译器是如何为多态代码生成字节码指令,在程序运行过程中,多态特性又是如何实现的。

   代码:   

                   class parent       

{

      public int value=100;

    public void Introduce()

         {

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

         }

}

 

 class Son extends parent

{

      public int value=101;

         public void Introduce()

      {

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

}

 

}

 

 

class Daughter extends parent

{

      public int value=102;

      public void Introduce()

      {

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

}

}

 

public class TestPolymorphism

{

    public static void main(String args[])

    {

        parent p=new parent();

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

       }  

}

    结果截图:

  在 java 语言中,多态性体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方法重写实现的动态多态性(运行时多态)。

  (1)编译时多态

    在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。  

  (2)运行时多态

    由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序

    中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用
    子类的方法。

    重写方法的调用原则(为重点):java 运行时系统根据调用该方法的实例,来决定调用哪个方法。

    对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承了
    父类的方法(未重写),则运行时系统调用父类的方法。

五.zoo1

  代码:

                           public class Zoo

{

 

       public static void main(String args[])

       {

 

              Feeder f = new Feeder("小李");

 

              // 饲养员小李喂养一只狮子

 

              f.feedLion(new Lion());

 

              // 饲养员小李喂养十只猴子

 

              for (int i = 0; i < 10; i++)

             {

 

                     f.feedMonkey(new Monkey());

 

              }

             

              // 饲养员小李喂养5只鸽子

 

              for (int i = 0; i < 5; i++)

             {

 

                     f.feedPigeon(new Pigeon());

 

              }

      

       }

 

}

 

 

class Feeder

{

 

 

       public String name;

 

 

       public Feeder(String name)

       {

 

              this.name = name;

 

       }

 

      

       public void feedLion(Lion l)

       {

 

              l.eat();

 

       }

 

      

       public void feedPigeon(Pigeon p)

       {

 

              p.eat();

 

       }

 

      

       public void feedMonkey(Monkey m)

       {

 

              m.eat();

 

       }

 

}

 

 

class Lion

{

 

 

       public void eat()

       {

 

              System.out.println("我不吃肉谁敢吃肉!");

 

       }

 

}

 

 

class Monkey

{

 

       public void eat()

       {

 

              System.out.println("我什么都吃,尤其喜欢香蕉。");

 

       }

 

}

 

 

class Pigeon

{

 

 

       public void eat()

       {

 

              System.out.println("我要减肥,所以每天只吃一点大米。");

 

       }

}

  结果截图

                     public class Zoo

{

 

       public static void main(String args[])

       {

 

              Feeder f = new Feeder("小李");

 

              // 饲养员小李喂养一只狮子

 

              f.feedLion(new Lion());

 

              // 饲养员小李喂养十只猴子

 

              for (int i = 0; i < 10; i++)

             {

 

                     f.feedMonkey(new Monkey());

 

              }

             

              // 饲养员小李喂养5只鸽子

 

              for (int i = 0; i < 5; i++)

             {

 

                     f.feedPigeon(new Pigeon());

 

              }

      

       }

 

}

 

 

class Feeder

{

 

 

       public String name;

 

 

       public Feeder(String name)

       {

 

              this.name = name;

 

       }

 

      

       public void feedLion(Lion l)

       {

 

              l.eat();

 

       }

 

      

       public void feedPigeon(Pigeon p)

       {

 

              p.eat();

 

       }

 

      

       public void feedMonkey(Monkey m)

       {

 

              m.eat();

 

       }

 

}

 

 

class Lion

{

 

 

       public void eat()

       {

 

              System.out.println("我不吃肉谁敢吃肉!");

 

       }

 

}

 

 

class Monkey

{

 

       public void eat()

       {

 

              System.out.println("我什么都吃,尤其喜欢香蕉。");

 

       }

 

}

 

 

class Pigeon

{

 

 

       public void eat()

       {

 

              System.out.println("我要减肥,所以每天只吃一点大米。");

 

       }

 

}

  结果截图:

  zoo2:

  代码:

      

public class Zoo

{

 

   

   public static void main(String args[])

   {

 

           Feeder f = new Feeder("小李");

 

           //饲养员小李喂养一只狮子

 

           f.feedAnimal(new Lion());

           //饲养员小李喂养十只猴子

 

           for (int i = 0; i < 10; i++)

      {

 

               f.feedAnimal(new Monkey());

  

        }

 

           //饲养员小李喂养5只鸽子

 

           for (int i = 0; i < 5; i++)

      {

 

               f.feedAnimal(new Pigeon());

 

           }

 

    }

 

}

 

 

class Feeder

{

 

 

    public String name;

 

 

    Feeder(String name)

    {

 

        this.name = name;

 

    }

 

   

    public void feedAnimal(Animal an)

   {

 

        an.eat();

 

    }

 

}

 

 

abstract class Animal

{

 

 

    public abstract void eat();

 

}

 

 

class Lion extends Animal

{

 

 

    public void eat()

   {

 

        System.out.println("我不吃肉谁敢吃肉!");

 

    }

 

}

 

 

class Monkey extends Animal

{

 

 

    public void eat()

    {

 

        System.out.println("我什么都吃,尤其喜欢香蕉。");

 

    }

 

}

 

 

class Pigeon extends Animal

{

 

   

    public void eat()

    {

 

        System.out.println("我要减肥,所以每天只吃一点大米。");

 

    }

 

}

  结果截图:

  zoo3:

  代码:

      

public class Zoo {

 

    public static void main(String args[]) {

        Feeder f = new Feeder("小李");

        Animal[] ans = new Animal[16];

 

        //饲养员小李喂养一只狮子

        ans[0] = new Lion();

        //饲养员小李喂养十只猴子

        for (int i = 0; i < 10; i++) {

            ans[1 + i] = new Monkey();

        }

        //饲养员小李喂养5只鸽子

        for (int i = 0; i < 5; i++) {

            ans[11 + i] = new Pigeon();

        }

 

        f.feedAnimals(ans);

    }

}

 

class Feeder {

 

    public String name;

 

    Feeder(String name) {

        this.name = name;

    }

 

    public void feedAnimals(Animal[] ans) {

        for (Animal an : ans) {

            an.eat();

        }

    }

}

 

abstract class Animal {

 

    public abstract void eat();

}

 

class Lion extends Animal {

 

    public void eat() {

        System.out.println("我不吃肉谁敢吃肉!");

    }

}

 

class Monkey extends Animal {

 

    public void eat() {

        System.out.println("我什么都吃,尤其喜欢香蕉。");

    }

}

 

class Pigeon extends Animal {

 

    public void eat() {

        System.out.println("我要减肥,所以每天只吃一点大米。");

    }

}

       结果截图:

  zoo4:

    代码:

        

import java.util.Vector;

 

public class Zoo {

 

    public static void main(String args[]) {

        Feeder f = new Feeder("小李");

        Vector<Animal> ans = new Vector<Animal>();

 

        //饲养员小李喂养一只狮子

        ans.add(new Lion());

        //饲养员小李喂养十只猴子

        for (int i = 0; i < 10; i++) {

            ans.add(new Monkey());

        }

        //饲养员小李喂养5只鸽子

        for (int i = 0; i < 5; i++) {

            ans.add(new Pigeon());

        }

        f.feedAnimals(ans);

    }

}

 

class Feeder {

 

    public String name;

 

    Feeder(String name) {

        this.name = name;

    }

 

    public void feedAnimals(Vector<Animal> ans) {

        for (Animal an : ans) {

            an.eat();

        }

    }

}

 

abstract class Animal {

 

    public abstract void eat();

}

 

class Lion extends Animal {

 

    public void eat() {

        System.out.println("我不吃肉谁敢吃肉!");

    }

}

 

class Monkey extends Animal {

 

    public void eat() {

        System.out.println("我什么都吃,尤其喜欢香蕉。");

    }

}

 

class Pigeon extends Animal {

 

    public void eat() {

        System.out.println("我要减肥,所以每天只吃一点大米。");

    }

}

    结果截图:

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

   代码:

      

import java.util.Scanner;

class cout1 extends Account{

     cout1(String kahao,String name,String Date,int mima,double yue){

            super(kahao,name,Date,mima,yue);

     }

     void qukuan(){

            yue=yue-100;

            if(yue>=0){

                   setyue(yue);

            }

            else

                   System.out.println("余额不足!");

     }

}

class cout2 extends Account{

     cout2(String kahao, String name, String Date, int mima, double yue) {

            super(kahao, name, Date, mima, yue);

    

     }

 

     void qukuan(){

            yue=yue-500;

            if(yue>=0){

                   setyue(yue);

            }

            else

                   System.out.println("余额不足!");

     }

}

class cout3 extends Account{

     cout3(String kahao, String name, String Date, int mima, double yue) {

            super(kahao, name, Date, mima, yue);

    

     }

 

     void qukuan(){

            yue=yue-1000;

            if(yue>=0){

                   setyue(yue);

            }

            else

                   System.out.println("余额不足!");

     }

}

class cout4 extends Account{

     cout4(String kahao, String name, String Date, int mima, double yue) {

            super(kahao, name, Date, mima, yue);

    

     }

 

     void qukuan(){

            yue=yue-1500;

            if(yue>=0){

                   setyue(yue);

            }

            else

                   System.out.println("余额不足!");

     }

}

class cout5 extends Account{

     cout5(String kahao, String name, String Date, int mima, double yue) {

            super(kahao, name, Date, mima, yue);

    

     }

 

     void qukuan(){

            yue=yue-2000;

            if(yue>=0){

                   setyue(yue);

            }

            else

                   System.out.println("余额不足!");

     }

}

class cout6 extends Account{

     cout6(String kahao, String name, String Date, int mima, double yue) {

            super(kahao, name, Date, mima, yue);

    

     }

 

     void qukuan(){

            yue=yue-5000;

            if(yue>=0){

                   setyue(yue);

            }

            else

                   System.out.println("余额不足!");

     }

}

class cout7 extends Account{

     cout7(String kahao, String name, String Date, int mima, double yue) {

            super(kahao, name, Date, mima, yue);

    

     }

 

     void qukuan(){

            Scanner innew Scanner(System.in);

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

            int d=in.nextInt();

            yue=yue-d;

            if(yue>=0){

                   setyue(yue);

            }

            else

                   System.out.println("余额不足!");

     }

}

 

class Account {

     private String kahao;

     private String name;

     private String Date;

     private int mima;

     protected double yue;

     Account(String kahao,String name,String Date,int mima,double yue){

            this.kahao=kahao;

            this.name=name;

            this.Date=Date;

            this.mima=mima;

            this.yue=yue;

     }

     public void setkahao(String kahao){

            this.kahao=kahao;

     }

     public String getkahao(){

            return kahao;

     }

     public void setname(String name){

            this.name=name;

     }

    

     public String getname(){

            return name;

     }

     public void setDate(String Date){

            this.Date=Date;

     }

     public String getDate(){

            return Date;

     }

     public void setmima(int mima){

            this.mima=mima;

     }

     public int getmima(){

            return mima;

     }

     public void setyue(double yue){

            this.yue=yue;

     }

     public double getyue(){

            return yue;

     }

    

 

     void menu(){

            System.out.println("欢迎使用ATM自助取款机,请选择功能");

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

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

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

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

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

            System.out.println("6、退出程序");

 

     }

     void cunkuan(){

            Scanner innew Scanner(System.in);//定义一个Scanner对象

            Scanner in1new Scanner(System.in);

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

            double yu1 = in.nextInt();

            yue=yue+yu1;

            setyue(yue);

           

     }

     void qukuan(){}

    

     void mima(){

            Scanner innew Scanner(System.in);

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

            int mi=in.nextInt();

            setmima(mi);

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

     }

     void zhuanzhang(){

            System.out.println("请输入转账帐号:");

            Scanner innew Scanner(System.in);

            String b=in.next();

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

            int c=in.nextInt();

            setyue(yue-c);

            System.out.println("转账成功");

     }

     void chaxun(){

            System.out.println("余额:"+getyue());

     }

}

public class Atm {

 

     public static void main(String[] args) {

            // TODO 自动生成的方法存根

 

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

            Scanner inputnew Scanner(System.in);

            int ma=input.nextInt();

            Account A=new Account("12345678901","xieshiyu","20161111",123456,2000);

            if(ma==A.getmima()){

                  

                  

            int i=1;

            while(i==1){

            Scanner innew Scanner(System.in);

            A.menu();

              int n = in.nextInt();

              if(n==1)

                     A.cunkuan();

              if(n==2){

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

    

                          System.out.println("请输入选项:(1:100 2:500 3:1000 4:1500 5:2000 6:5000 7:其他金额)");

                          int a=input.nextInt();

                          double yu=A.getyue();

                          if(a==1)

                                 {

                                 yu=A.getyue();

                                 A=new cout1("12345678901","xieshiyu","20161111",123456,yu);A.qukuan();

                                 }

                          if(a==2)

                                 { yu=A.getyue();

                                 A=new cout2("12345678901","xieshiyu","20161111",123,yu);A.qukuan();}

                          if(a==3)

                                 { yu=A.getyue();

                                 A=new cout3("12345678901","xieshiyu","20161111",123456,yu);A.qukuan();}

                          if(a==4)

                                 { yu=A.getyue();

                                 A=new cout4("12345678901","xieshiyu","20161111",123456,yu);A.qukuan();}

                          if(a==5)

                                 { yu=A.getyue();

                                 A=new cout5("12345678901","xie","20161111",123456,yu);A.qukuan();}

                          if(a==6)

                                 { yu=A.getyue();

                                 A=new cout6("12345678901","xieshiyu","20161111",123456,yu);A.qukuan();}

                          if(a==7)

                                 { yu=A.getyue();

                                 A=new cout7("12345678901","xieshiyu","20161111",123456,yu);A.qukuan();}

              }

              if(n==3)

                     A.zhuanzhang();

              if(n==4)

                     A.mima();

              if(n==5)

                     A.chaxun();

              if(n==6)

              {

                     i=0;

                     System.out.println("退卡成功");

              }

            }

     }

            else

             System.out.println("密码错误,登录失败");

     }

    

 

}

   结果截图:

 

原文地址:https://www.cnblogs.com/xieshiyu/p/6077557.html