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

(0)

相关推荐

  • Java 重载、重写、构造函数的实例详解

    Java 重载.重写.构造函数的实例详解 方法重写 1.重写只能出现在继承关系之中.当一个类继承它的父类方法时,都有机会重写该父类的方法.一个特例是父类的方法被标识为final.重写的主要优点是能够定义某个子类型特有的行为. class Animal { public void eat(){ System.out.println ("Animal is eating."); } } class Horse extends Animal{ public void eat(){ Syste

  • Java重写与重载之间的区别

    重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能够根据需要实现父类的方法. 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常.例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOEx

  • java方法重写和super关键字实例详解

     java方法重写和super关键字  在继承中,其实就是子类定义了和父类同名的方法 就是方法,属性都是相通的 重写限制:  被子类重写的方法不能拥有比父类方法更加严格的权限 super:强行调用父类方法的执行 重载和重写的区别?  重 载是发生在一个类中   对权限没有要求   而且重载的方法参数可以不同 重写发生在继承汇总      被子类重写的方法不能拥有比父类方法更加严格的权限,重写的方法中参数名字完全相同  实例代码: class A{ public void tell(){ Syst

  • 重写Java中的equals方法介绍

    Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型,不论是对象数组,列表等都扩展了Object类.了解学习Object中方法的设计原理和实现方式有助于更好的学习理解java语言.下面,我们首先学习一下Object中的equals方法. 判断两个对象相等时,JVM首先查找两个对象的hashCode, 如果两者hashCode不同,则返回false;如果

  • Java 重写与重载方法与区别详解

    重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能够根据需要实现父类的方法. 在面向对象原则里,重写意味着可以重写任何现有方法.实例如下: class Animal{ public void move(){ System.out.println("动物可以移动"); } } class Dog extends Animal{ public

  • java 重载(overload)与重写(override)详解及实例

    很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆. 先给出我的定义: overload(重载):在同一类或者有着继承关系的类中,一组名称相同,参数不同的方法组.本质是对不同方法的称呼. override(覆写):存在继承关系的两个类之间,在子类中重新定义了父类中存在的方法.本质是针对同一个方法,给出不同的实现. 我们先来看重载的例子: public class OverloadParent{ public String getPerson(

  • 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)

  • java 各种数据类型的互相转换实例代码

    StringBuilder转化为String String str = "abcdefghijklmnopqrs"; StringBuilder stb = new StringBuilder(str); 整型数组转化为字符串 StringBuilder s = new StringBuilder(); for(i=1;i<=n;i++) { s.append(String.valueOf(a[i])); } String str = ""+s; 字符串转化为

  • 深入了解Java方法的重载与重写

    目录 1.方法的重载 1.1.基本介绍 1.2.重载的好处 1.3.重载使用细节 1.4.可变参数 2.方法的重写 2.1.基本介绍 2.2.重写的好处 2.3.重写的细节 3.重写与重写的对比 1.方法的重载 1.1.基本介绍 在同一个类中,允许多个重名方法的存在,但要求形参列表不一致. 比如: System.out.println(11)//输出整数 System.out.println("Javayyds")//输出字符串 System.out.println("1.1

  • Java使用正则表达式(regex)匹配中文实例代码

    只能输入中文 /** * 22.验证汉字 * 表达式 ^[\u4e00-\u9fa5]{0,}$ * 描述 只能汉字 * 匹配的例子 清清月儿 */ @Test public void a1() { Scanner sc = new Scanner(System.in); String input = sc.nextLine(); String regex = "^[\\u4e00-\\u9fa5]*$"; Matcher m = Pattern.compile(regex).matc

  • Java web的读取Excel简单实例代码

    目录结构: Data.xls数据: 后台页面: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //System.out.println(this.getServletContext().getRealPath ("/")); try{ Workbook wb = Workbook.getWorkbook(

  • Java Web 简单的分页显示实例代码

    本文通过两个方法:(1)计算总的页数. (2)查询指定页数据,实现简单的分页效果. 思路:首先得在 DAO 对象中提供分页查询的方法,在控制层调用该方法查到指定页的数据,在表示层通过 EL 表达式和 JSTL 将该页数据显示出来. 先给大家展示下效果图: 题外话:该分页显示是用 "表示层-控制层-DAO层-数据库"的设计思想实现的,有什么需要改进的地方大家提出来,共同学习进步.废话不多说了,开始进入主题,详细步骤如下所示: 1.DAO层-数据库 JDBCUtils 类用于打开和关闭数据

  • java 日期各种格式之间的相互转换实例代码

    java 日期各种格式之间的相互转换实例代码 java日期各种格式之间的相互转换,直接调用静态方法 实例代码: java日期各种格式之间的相互转换,直接调用静态方法 package com.hxhk.cc.util; import java.text.SimpleDateFormat; import java.util.Date; import com.lowagie.text.pdf.codec.postscript.ParseException; public class DateUtil

  • java 文件大数据Excel下载实例代码

    java 文件大数据Excel下载实例代码 excel可以用xml表示.故可以以此来实现边写边下载文件 package com.tydic.qop.controller; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.I

  • Java 大小写最快转换方式实例代码

    Java 大小写最快转换方式实例代码          这里直接给出实现代码,在代码中注释都很清楚,不多做介绍. Java代码 package io.mycat; import java.util.stream.IntStream; /** * 小写字母的 'a'=97 大写字母 A=65 更好相差32利用这个差进行大小写转换 * @author : Hpgary * @date : 2017年5月3日 10:26:26 * @mail: hpgary@qq.com * */ public cl

  • Java中自定义异常详解及实例代码

    Java中自定义异常详解及实例代码 下面做了归纳总结,欢迎批评指正 自定义异常 class ChushulingException extends Exception { public ChushulingException(String msg) { super(msg); } } class ChushufuException extends Exception { public ChushufuException(String msg) { super(msg); } } 自定义异常 En

随机推荐