java 函数的重载和重写实例代码

 更新时间:2016年07月20日 11:48:06   投稿:lqh  
本文主要介绍Java 的重载和重写,学习java的同学都知道Java的多态有多重要,这里给大家举例说明函数的重载和重写,希望能帮助有需要的小伙伴

在java中多态分为两种编译时多态(重载)和运行时多态(重写),编译时多态又叫前绑定,运行时多态又叫后绑定。

下面用一个例子说明:

public class OverloadAndOverwrite { 
  public static void main(String[] args) { 
    A a1 = new A(); 
    A a2 = new B(); 
    B b = new B(); 
    C c = new C(); 
    D d = new D(); 
    System.out.print("a1.print(a1): "); 
    a1.print(a1);//输出A and A 
    System.out.print("a1.print(b): "); 
    a1.print(b);//输出A and A:原因是因为A中不存在参数为B的方法,因此会调用参数为A的方法,因为B是继承自A的 
    System.out.print("a1.print(c): "); 
    a1.print(c);//输出A and A:原因是因为A中不存在参数为C的方法,因此会调用参数为A的方法,因为C是继承自B的,B是继承自A的 
    System.out.print("a1.print(d): "); 
    a1.print(d);//输出A and D:原因是因为A中存在参数为D的方法,因此会调用参数为D的方法 
    System.out.print("a2.print(b): "); 
    a2.print(b);//输出B and A:原因在于首先入口是A,首先查看A中是否有参数为B的print方法,发现没有那就寻找有没有参数为A的方法,因为B是继承自A的,发现存在这样的方法,那么再次查看B中有没有重写这个方法,发现有重新,直接调用B中这个重写的方法 
    System.out.print("a2.print(c): "); 
    a2.print(c);//输出B and A:原因在于首先入口是A,首先查看A中是否有参数为C的print方法,发现没有那就寻找有没有参数为B的方法,因为C是继承自B的,发现也不存在这样的方法,那就寻找存在参数为A的print方法,因为B继承自A,发现存在这样的方法,那么再次查看B中有没有重写这个方法,发现有重新,直接调用B中这个重写的方法 
    System.out.print("a2.print(d): "); 
    a2.print(d);//输出 A and D:原因在于入口是A,查看A中存在参数为D的方法,再次查看B中没有重写这个方法,因此输出A中这个方法的结果即可; 
    System.out.print("a2.print(a2): "); 
    a2.print(a2);//输出B and A;原因在于a2的类型是A,因此会调用A里面参数为A的print方法,但是a2右边new的是B,所以因为B中有参数为A的方法,因此采用的是B里面的这个方法 
    System.out.print("b.print(b): "); 
    b.print(b);//输出B and B;原因:入口是B,因此查看B中存不存在参数为B的print函数,存在则直接输出; 
    System.out.print("b.print(c): "); 
    b.print(c);//输出B and B;原因:入口是B,因此查看B中存不存在参数为C的print函数,发现不存在,则查看存不存在参数为B的print函数,发现存在,并且C中并没有重写该方法,则直接输出;有一点需要注意的是还需要查看一下A中是否存在参数为C的print方法,因为B继承自A,有的话会及成果来这个方法,这样的话输出的结果将变为A and C 
    System.out.print("b.print(d): "); 
    b.print(d);//输出A and D;原因:入口是B,虽然B中不存在参数为D的print函数,但是B继承自A,A中是存在参数为D的print函数的,因此输出的是A中参数为D的结果; 
  } 
} 
class A 
{ 
  public void print(A a) 
  { 
    System.out.println("A and A"); 
  } 
  public void print(D d) 
  { 
    System.out.println("A and D"); 
  } 
// public void print(C c) 
// { 
//   System.out.println("A and C"); 
// } 
} 
class B extends A 
{ 
  public void print(B b) 
  { 
    System.out.println("B and B"); 
  } 
  public void print(A a) 
  { 
    System.out.println("B and A"); 
  } 
} 
class C extends B{} 
class D extends C{} 

在此需要说明的是:

对于 A a2 = new B( );

 如果单独打印出a2的话,打印结果是B@(hash码),而不是A@(hash码),但这并不能说明a2的类型是B类型的,因为当我们在上面程序中调用a2.print(a2);的时候输出的结果是B and A而不是A and A(如果假设a2是B类型的话,就应该调用A类中参数为B的print方法,因为不存在这样的方法,那么退而求其次调用参数为A的方法就应该输出A and A了,因为B是A的子类)。

以上就是对重写和重载的实例代码分析,希望对Java学习的同学有帮助。

相关文章

  • POST方法给@RequestBody传参数失败的解决及原因分析

    POST方法给@RequestBody传参数失败的解决及原因分析

    这篇文章主要介绍了POST方法给@RequestBody传参数失败的解决及原因分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java中的HashMap源码分析

    Java中的HashMap源码分析

    这篇文章主要介绍了Java中的HashMap源码分析,散列表是根据关键码值(Key value)而直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数,存放记录的数组叫做散列表,需要的朋友可以参考下
    2023-09-09
  • Java Maven高级之插件开发详解

    Java Maven高级之插件开发详解

    这篇文章主要介绍了Maven 插件开发的详细整理的相关资料,需要的朋友可以看下,希望能够给你带来帮助
    2021-09-09
  • 关于@ComponentScan TypeFilter自定义指定扫描bean的规则

    关于@ComponentScan TypeFilter自定义指定扫描bean的规则

    这篇文章主要介绍了关于@ComponentScan TypeFilter自定义指定扫描bean的规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 深入了解SparkSQL的运用及方法

    深入了解SparkSQL的运用及方法

    SparkSQL就是将SQL转换成一个任务,提交到集群上运行,类似于Hive的执行方式。本文给大家分享了SparkSQl的运用及方法,感兴趣的朋友跟随小编一起看看吧
    2022-03-03
  • Spring Boot 缓存 Cache 入门详解

    Spring Boot 缓存 Cache 入门详解

    本文主要介绍SpringBoot缓存的入门知识,包括缓存的必要性、常见的缓存策略、SpringCache的注解使用、SpringBoot与缓存的集成以及Ehcache和Redis的示例,同时,还提供了缓存面试问题的思路和答案,帮助读者更好地理解和掌握SpringBoot缓存的相关内容,感兴趣的朋友一起看看吧
    2025-03-03
  • java解析dbf之通过javadbf包生成和读取dbf文件

    java解析dbf之通过javadbf包生成和读取dbf文件

    这篇文章主要介绍了java通过javadbf读取和生成DBF文件的方法,大家参考使用吧
    2014-01-01
  • Springboot详细讲解RocketMQ实现顺序消息的发送与消费流程

    Springboot详细讲解RocketMQ实现顺序消息的发送与消费流程

    RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等,本篇我们了解如何实现顺序消息的发送与消费
    2022-06-06
  • Java中的StringUtils引入及使用示例教程

    Java中的StringUtils引入及使用示例教程

    这篇文章主要介绍了Java中的StringUtils引入及使用示例教程,本文结合示例代码给大家介绍的非常详细,介绍了java中StringUtils用法,感兴趣的朋友跟随小编一起看看吧
    2023-01-01
  • Java软件设计模式之桥接模式详解

    Java软件设计模式之桥接模式详解

    这篇文章主要介绍了Java软件设计模式之桥接模式详解,桥接模式也叫做桥梁模式,结构型设计模式的一种,顾名思义,就是用来连接两个部分,为被分离了的抽象部分和实现部分搭桥,需要的朋友可以参考下
    2023-07-07

最新评论