zoukankan      html  css  js  c++  java
  • Java面向对象-对象的多态性

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

    Java中的多态性表现:

    1,方法的重载和重写(覆盖);

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

    我们先搞个父类Animal:

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

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

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

    然后我们写个Test测试类:

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

    运行输出:

    我是一个狗

    我是一个猫

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

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

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

    运行输出:

    我是一个狗

    我是一个猫

    对象的转型:

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

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

     

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

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

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

    运行报错:

    我是一个狗

    我是一个狗

    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 package com.java1234.chap03.sec13;
    2  
    3 public interface People {
    4  
    5     public void say();
    6 }

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

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

    我们来写一个测试类:

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

    运行输出:

    我是学生

    我是老师

  • 相关阅读:
    Saltstack module apache 详解
    Saltstack module ip 详解
    Saltstack module iosconfig 详解
    Saltstack module introspect 详解
    Saltstack module inspector 详解
    Saltstack module ini 详解
    Saltstack module incron 详解
    Modbus 指令 RS485指令规则
    停车系统对接第三方在线支付平台(二)
    停车系统对接第三方在线支付平台
  • 原文地址:https://www.cnblogs.com/eaglezb/p/5961785.html
Copyright © 2011-2022 走看看