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 }

    运行输出:

    我是学生

    我是老师

  • 相关阅读:
    thinkphp 学习1-模型
    apache 2.4目录权限
    标头 header()函数的用法
    PHP面试题一
    php学习
    如何执行超过一百兆(100MB)的sql脚本?
    jquery-numberformatter插件
    xpath 获取父级,和同级
    Vue el-table 行编辑验证、重置
    Vue 弹窗一个新增编辑页面
  • 原文地址:https://www.cnblogs.com/eaglezb/p/5961785.html
Copyright © 2011-2022 走看看