Java面向对象--对象的多态性

    xiaoxiao2021-12-10  20

    Java中的多态性表现:

    1,方法的重载和重写;

    2,可以用父类的引用指向子类的具体实现,而且可以随时更换为其他子类的具体实现;

    我们先搞个父类Animal:

    1 2 3 4 5 6 7 8 package  com.java1234.chap03.sec13;   public  class  Animal {        public  void  say(){          System.out.println( "我是一个动物" );      } }

    再搞两个子类,分别是Dog和Cat类,重写父类方法say:

    1 2 3 4 5 6 7 8 package  com.java1234.chap03.sec13;   public  class  Cat  extends  Animal{        public  void  say(){          System.out.println( "我是一个猫" );      } } 1 2 3 4 5 6 7 8 package  com.java1234.chap03.sec13;   public  class  Dog  extends  Animal{        public  void  say(){          System.out.println( "我是一个狗" );      } }

    然后我们写个Test测试类:

    1 2 3 4 5 6 7 8 9 10 11 12 package  com.java1234.chap03.sec13;   public  class  Test {        public  static  void  main(String[] args) {          Dog dog= new  Dog();          dog.say();                    Cat cat= new  Cat();          cat.say();      } }

    运行输出:

    我是一个狗

    我是一个猫

    这个大家肯定能看明白 简单的子类继承 以及实例化对象 调用方法 ;

    下面我来用多态测试,父类引用指向子类具体实现:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 package  com.java1234.chap03.sec13;   public  class  Test {        public  static  void  main(String[] args) {          // 父类引用指向Dog子类的具体实现          Animal animal= new  Dog();          animal.say();                    // 更换实现          animal= new  Cat();          animal.say();      } }

    运行输出:

    我是一个狗

    我是一个猫

    对象的转型:

    向上转型:子类对象->父类对象 安全

    向下转型:父类对象->子类对象 不安全

    比如上面的实例:Animal animal=new Dog(); 就是后面的new Dog() 子类对象 向上  Animail animal 转型  是安全的;

    向下转型 是父类对象强制转换成子类对象:我们来改下Test类:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package  com.java1234.chap03.sec13;   public  class  Test {        public  static  void  main(String[] args) {          // 父类引用指向Dog子类的具体实现          Animal animal= new  Dog();          animal.say();                    // 向下转型          Dog dog=(Dog) animal;          dog.say();                    // 向下转型  因为animal指向的是Dog具体实现 所以会报错          Cat cat=(Cat)animal;          cat.say();      } }

    运行报错:

    我是一个狗

    我是一个狗

    Exception in thread "main" java.lang.ClassCastException: com.java1234.chap03.sec13.Dog cannot be cast to com.java1234.chap03.sec13.Cat

    at com.java1234.chap03.sec13.Test.main(Test.java:15)

    转换异常 所以说向下转型是不安全的,我们必须知道具体的实现类;

    我们上面用的继承方式演示了多态 其实在实际开发中 更多的是用接口:

    我们再写一个实例:

    我们先建一个父类接口People:

    1 2 3 4 5 6 package  com.java1234.chap03.sec13;   public  interface  People {        public  void  say(); }

    接下来写两个具体实现类,Student Teacher:

    1 2 3 4 5 6 7 8 9 10 package  com.java1234.chap03.sec13;   public  class  Student  implements  People{        @Override      public  void  say() {          System.out.println( "我是学生" );      }   } 1 2 3 4 5 6 7 8 9 10 package  com.java1234.chap03.sec13;   public  class  Teacher  implements  People{        @Override      public  void  say() {          System.out.println( "我是老师" );      }   }

    我们来写一个测试类:

    1 2 3 4 5 6 7 8 9 10 11 12 package  com.java1234.chap03.sec13;   public  class  Test2 {        public  static  void  main(String[] args) {          People p1= new  Student();          p1.say();                    p1= new  Teacher();          p1.say();      } }

    运行输出:

    我是学生

    我是老师

    转载请注明原文地址: https://ju.6miu.com/read-700057.html

    最新回复(0)