zoukankan      html  css  js  c++  java
  • 多态

    一.可以使用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("密码错误,登录失败");

         }

        

     

    }

       结果截图:

     

  • 相关阅读:
    树链剖分学习笔记(未完)
    VI 配置文件(略全)
    linux之awk
    指针之基础篇
    linux之sed
    sqlplus命令手册
    Leetcode复习: 堆和栈
    leetcode 的shell部分4道题整理
    Regular Expression Matching [leetcode]
    深入浅出JAVA
  • 原文地址:https://www.cnblogs.com/xieshiyu/p/6077557.html
Copyright © 2011-2022 走看看