• Java中面向对象三大特性之——多态


    多态的概述: 

    多态是继封装、继承之后,面向对象的第三大特性。

    生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞机,飞起来也是不一样的。可见,同一行为,通过不同的事物,可以体现出来的不同的形态。多态,描述的就是这样的状态。

    多态的条件

    1.继承

     

    2.方法的重写 (为了让多态有意义)

    3.父类的引用指向子类的对象

    多态的体现

     

    父类类型 变量名 = new 子类对象;
    变量名.方法名();

     

    当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写后方法。

    举例代码

    定义父类:

    public abstract class Animal {  
        public abstract void eat();  
    }  

    定义子类:

    class Cat extends Animal {  
        public void eat() {  
            System.out.println("吃鱼");  
        }  
    }  
    
    class Dog extends Animal {  
        public void eat() {  
            System.out.println("吃骨头");  
        }  
    }

    定义测试类:

    public class Test {
        public static void main(String[] args) {
            // 多态形式,创建对象
            Animal a1 = new Cat();  
            // 调用的是 Cat 的 eat
            a1.eat();          
    
            // 多态形式,创建对象
            Animal a2 = new Dog(); 
            // 调用的是 Dog 的 eat
            a2.eat();               
        }  
    }

    多态的好处

    实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用,更能体现出多态的扩展性与便利。

    举例代码

    定义父类:

    public abstract class Animal {  
        public abstract void eat();  
    }  

    定义子类:

    class Cat extends Animal {  
        public void eat() {  
            System.out.println("吃鱼");  
        }  
    }  
    
    class Dog extends Animal {  
        public void eat() {  
            System.out.println("吃骨头");  
        }  
    }

    定义测试类:

    public class Test {
        public static void main(String[] args) {
            // 多态形式,创建对象
            Cat c = new Cat();  
            Dog d = new Dog(); 
    
            // 调用showCatEat 
            showCatEat(c);
            // 调用showDogEat 
            showDogEat(d); 
    
            /*
            以上两个方法, 均可以被showAnimalEat(Animal a)方法所替代
            而执行效果一致
            */
            showAnimalEat(c);
            showAnimalEat(d); 
        }
    
        public static void showCatEat (Cat c){
            c.eat(); 
        }
    
        public static void showDogEat (Dog d){
            d.eat();
        }
    
        public static void showAnimalEat (Animal a){
            a.eat();
        }
    }

    多态成员的访问特点:

    访问成员变量: 编译看左边,运行看左边

    访问成员方法:

    非静态成员方法: 编译看左边,运行看右边

    静态成员方法:  编译看左边,运行看左边

    记忆: 只有非静态成员方法才会编译看左边,运行看右边,其他的都是编译看左边,运行看左边

    多态的好处

    使用父类类型作为方法的参数,可以接收该类所有的子类对象

    tips: 如果方法的参数是Object类型,那么就可以接收任意类的对象

    多态的弊端

    无法调用子类特有的方法

    (关于如何解决多态的弊端,可以看下一章引用类型的转换

     

     

  • 相关阅读:
    LeetCode 230. 二叉搜索树中第K小的元素
    LeetCode 669. 修剪二叉搜索树
    LeetCode 94. 二叉树的中序遍历
    LeetCode 145. 二叉树的后序遍历
    LeetCode 144. 二叉树的前序遍历
    Not registered via @EnableConfigurationProperties or marked as Spring component
    maven依赖的报错Unable to import maven project: See logs for details
    GDIPlus的使用准备工作
    全局变量替代方案:控制反转,依赖注入
    MFC使用TRACKMOUSEEVENT触发mouseHover和mouseLeave
  • 原文地址:https://www.cnblogs.com/libinhong/p/10990504.html
Copyright © 2020-2023  润新知