• Day22:多态详解


    方法的多态

    1.1什么是多态?

    指一个对象在不同时刻拥有不同的形态。

    例:猫 cat=new 猫();

    ​ 动物 animal=new 猫();

    多态建立的条件:

    1. 建立在继承的关系上;
    2. 有方法重写;
    3. 有父类的引用指向子类对象(父类引用指向即 动物 animal)

    我们通过代码进一步了解多态:

    将多态建立的条件加入代码之中

    //建立一个父类
    public class Animals{
        //创建父类方法
        public void eat(){
            System.out.println("动物在吃东西");
        }
    }
    
    //建立一个子类
    public class Cat extends Animals{//建立继承关系
         //方法重写
        public void eat(){  
        System.out.println("猫在吃鱼");
        }
    }
    
    //建立一个测试类
    public class Aplication{
        public static void main(String[] args){
            //建立父类的引用指向子类对象
            Animals a=new Cat();
        }
    }
    

    以上根据多态的三个前提条件我们建立了多态。

    1.2多态中的成员访问特点

    多态中的成员访问特点:

    成员属性:编译和运行都看左边;

    成员方法:编译看左边,运行看右边。

    我们通过以下代码对特点进一步的了解:

    //建立一个父类
    public class Animals{
        int age=40;
        public void eat(){
            System.out.println("动物在吃东西");
        }
        public void play(){
        Sysem,out,println("动物在玩游戏");
        }
    }
    
    //建立一个子类
    public class Cat extends Animals{//建立继承关系
        String name="花儿";
        int age=5public void eat(){  
        System.out.println("猫在吃鱼");
        }
        public void shout(){  
        System.out.println("猫在叫");
        }
        
    }
    
    //建立一个测试类
    public class Aplication{
        public static void main(String[] args){
            Animals a=new Cat();
            
            //分别调用成员并输出
            Sytem.out.println(a.age);
            Sytem.out.println(a.name);
            Sytem.out.println(a.eat);
            Sytem.out.println(a.play);
            Sytem.out.println(a.shout);
        }
    }
    
    //输出结果
    40
    ClassCastException
    猫在吃鱼
    动物在玩游戏
    ClassCastException
    

    我们来对结果进行分析:

    父类中的成员属性有age;子类的成员属性有name、age

    我们建立的对象引用是父类的;但对象的实际本质是子类对象

    这也就将对象实例化分为了左右,而外界看到的则是左侧的引用类型

    所以当我们调用属性、方法时,最开始编译就从左边开始,然后运行右边

    引用类型为父类,其成员含有age、eat、play;当我们调用age、eat、play时,我们是能够成功调用的;而调用name(非父类成员)时发现报错

    由此我们可以得出第一个结论:

    多态现象中,我们可以调用什么成员是由左边的引用类型决定的!

    我们从结果发现a.age的结果是父类的属性

    由此我们得到第二个结论:

    多态现象中,属性的编译和运行都是由左边的引用类型决定的!

    我们从输出结果发现我们调用eat方法时,输出的结果却是子类eat方法(重写)的结果;而调用play(未重写)方法时,输出的是父类的play方法;而调用shout方法则无法调用

    由此我们可以得出第三个结论:

    多态现象中,方法的编译是看左边,运行是看右边!


    总结以上结论:

    成员属性:编译和运行都看左边;

    成员方法:编译看左边,运行看右边。

  • 相关阅读:
    再谈Http和Https及TCP/UDP/IP协议分析,面试官都惊讶的网络见解
    面试题什么是分布式垃圾回收(DGC)?它是如何工作的?
    java计算机毕业设计高校招生管理系统源码+数据库+系统+lw文档+部署
    命名空间namespace
    十五、Java中I/O流
    计蒜客详解合集(1)期
    【2022 小目标检测综述】Towards Large-Scale Small Object Detection: Survey and Benchmarks
    <C++入门基础>【下】
    ABC-270 F - Transportation(kruskal)
    vue 路由学习笔记
  • 原文地址:https://www.cnblogs.com/CQliuwei/p/16926728.html