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学习的同学有帮助。

相关文章

  • 带你了解Java中的异常处理(下)

    带你了解Java中的异常处理(下)

    这篇文章主要介绍了Java中的异常处理的相关资料,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-08-08
  • Java持久层面试题目及答案整理

    Java持久层面试题目及答案整理

    在本篇文章里小编给大家分享的是一篇关于Java持久层面试题目及答案整理内容,需要的朋友们学习参考下。
    2020-02-02
  • SpringMVC配置与使用详细介绍

    SpringMVC配置与使用详细介绍

    Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内配合
    2022-07-07
  • Java 静态代理与动态代理解析

    Java 静态代理与动态代理解析

    这篇文章主要介绍了Java 静态代理与动态代理解析,关于静态代理与动态代理,一直是比较困扰很多新人开发,但实际我们开发中,小到写的某个工具类,大到经常使用的Retrofit 其内部都使用了动态代理,所以这篇文章从基础到源码解析,以便简单理解静态代理与Jdk中的动态代理
    2022-02-02
  • java核心编程之文件过滤类FileFilter和FilenameFilter

    java核心编程之文件过滤类FileFilter和FilenameFilter

    这篇文章主要为大家详细介绍了java文件过滤类FileFilter和FilenameFilter,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Java创建可执行JAR文件的多种方式

    Java创建可执行JAR文件的多种方式

    本文主要介绍了Java创建可执行JAR文件的多种方式,使用JDK的jar工具、IDE、Maven和Gradle来创建和配置可执行JAR文件,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • Springboot获取jar包中resources资源目录下的文件

    Springboot获取jar包中resources资源目录下的文件

    今天在项目中遇到一个业务场景,需要用到resources资源目录下的文件,本文主要介绍了Springboot获取jar包中resources资源目录下的文件,感兴趣的可以了解一下
    2023-12-12
  • java Hibernate 一对多自身关联问题

    java Hibernate 一对多自身关联问题

    formBean在提交表单的时候,域中数据库在下一次中仍然保留引起的,struts formBean 默认的scope为session,手动设置为request,就好了
    2008-07-07
  • Kotlin 基本语法实例详解

    Kotlin 基本语法实例详解

    这篇文章主要介绍了Kotlin 基本语法实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • mybatis新增到数据库后返回当前ID问题

    mybatis新增到数据库后返回当前ID问题

    这篇文章主要介绍了mybatis新增到数据库后返回当前ID问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论