zoukankan      html  css  js  c++  java
  • Java从入门到实战之(16)面向对象之对象的多态性(四)

    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 }
    复制代码

    运行输出:

    我是学生

    我是老师

  • 相关阅读:
    虚拟机简介
    关于JavaScript的那些话
    关于Python的那些话
    JavaScript教程大纲
    一个resin启动bug的解决
    Python教程大纲
    zinnia项目功能分析
    CDN公共资源
    Django Web项目部署参考
    Django Web项目代码规范参考
  • 原文地址:https://www.cnblogs.com/huanghanyu/p/13807710.html
Copyright © 2011-2022 走看看