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

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

    Java中的多态性表现:

    1,方法的重载和重写;

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

    我们先搞个父类Animal:

    package com.htli.chap03.sec13;
     
    public class Animal {
     
        public void say(){
            System.out.println("我是一个动物");
        }
    }
    

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

    package com.htli.chap03.sec13;
     
    public class Cat extends Animal{
     
        public void say(){
            System.out.println("我是一个猫");
        }
    }
    

     

    package com.htli.chap03.sec13;
     
    public class Dog extends Animal{
     
        public void say(){
            System.out.println("我是一个狗");
        }
    }
    

     然后我们写个Test测试类:

    package com.htli.chap03.sec13;
     
    public class Test {
     
        public static void main(String[] args) {
            Dog dog=new Dog();
            dog.say();
             
            Cat cat=new Cat();
            cat.say();
        }
    }
    

    运行输出:

    我是一个狗

    我是一个猫

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

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

    package com.htli.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类:

    package com.htli.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.htli.chap03.sec13.Dog cannot be cast to com.htli.chap03.sec13.Cat

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

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

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

    我们再写一个实例:

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

      

    package com.htli.chap03.sec13;
     
    public interface People {
     
        public void say();
    }
    

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

    package com.htli.chap03.sec13;
     
    public class Student implements People{
     
        @Override
        public void say() {
            System.out.println("我是学生");
        }
     
    }
    

      

    package com.htli.chap03.sec13;
     
    public class Teacher implements People{
     
        @Override
        public void say() {
            System.out.println("我是老师");
        }
     
    }
    

      我们来写一个测试类:

    package com.htli.chap03.sec13;
     
    public class Test2 {
     
        public static void main(String[] args) {
            People p1=new Student();
            p1.say();
             
            p1=new Teacher();
            p1.say();
        }
    }
    

      

    运行输出:

    我是学生

    我是老师

    - 未来可能遥远,但不轻易放弃 The future may be far away, but it is not easy to give up
  • 相关阅读:
    理解 RESTful:理论与最佳实践
    Shiro 性能优化:解决 Session 频繁读写问题
    单点登录的三种实现方式
    理解 Spring(二):AOP 的概念与实现原理
    理解 Spring(一):Spring 与 IoC
    MFC查内存泄漏方法
    024 --- 第28章 访问者模式
    023 --- 第27章 解释器模式
    022 --- 第26章 享元模式
    021 --- 第25章 中介者模式
  • 原文地址:https://www.cnblogs.com/leehaitao/p/7351004.html
Copyright © 2011-2022 走看看