ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多态

2022-01-02 15:33:33  阅读:147  来源: 互联网

标签:子类 多态 JNC 父类 方法 Wine


所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

在满足向上转型(创建子类类型,赋值给父类类型)时,我们应满足以下条件:

  • 存在继承关系
  • 子类要重写父类的方法
  • 父类指向子类(即 父类 对象名 = new 子类类型)

如:

public class Wine {

    public void fun1(){

        System.out.println("Wine 的Fun.....");

        fun2();

    }

   

    public void fun2(){

        System.out.println("Wine 的Fun2...");

    }

}

 

public class JNC extends Wine{

    /**

     * @desc 子类重载父类方法

     *        父类中不存在该方法,向上转型后,父类是不能引用该方法的

     * @param a

     * @return void

     */

    public void fun1(String a){

        System.out.println("JNC 的 Fun1...");

        fun2();

    }

   

    /**

     * 子类重写父类方法

     * 指向子类的父类引用调用fun2时,必定是调用该方法

     */

    public void fun2(){

        System.out.println("JNC 的Fun2...");

    }

}

 

public class Test {

    public static void main(String[] args) {

        Wine a = new JNC();

        a.fun1();

    }

}

Output:

Wine 的Fun.....

JNC 的Fun2...

从程序的运行结果中我们发现,a.fun1()首先是运行父类Wine中的fun1().然后再运行子类JNC中的fun2()。

      分析:在这个程序中子类JNC重载了父类Wine的方法fun1(),重写fun2(),而且重写后的fun1(String a)与 fun1()不是同一个方法,由于父类中没有该方法,向上转型后会丢失该方法,所以执行JNC的Wine类型引用是不能引用fun1(String a)方法。而子类JNC重写了fun2() ,那么指向JNC的Wine引用会调用JNC中fun2()方法。

      所以对于多态我们可以总结如下:

      指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。

      对于面向对象而已,多态分为编译时多态和运行时多态。其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。

 

标签:子类,多态,JNC,父类,方法,Wine
来源: https://www.cnblogs.com/xyczxf/p/15757553.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有