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



相关阅读:
浅谈php正则表达式中的非贪婪模式匹配的使用
PHP的时间戳与具体时间转化的简单实现
C++中的重载、覆盖、隐藏介绍
(图)全新windows 10 Build 10074泄露
node.js中的fs.fsyncSync方法使用说明
PHP无限分类(树形类)
浅析Java的Spring框架中IOC容器容器的应用
史上最详细的js日期正则表达式分享
试用php中oci8扩展
c#网络唤醒功能实现
jQuery ajax方法传递中文时出现中文乱码的解决方法
win8.1系统Chrome浏览器出现"没有注册类"的解决方法
js返回前一页刷新本页重载页面
C语言fillpoly函数详解
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 金钱不是万能的 ——《百万英镑》读后感 爬府山 大二入党转正申请书600字 天降十八猪--22 区妇联2012年创先争优工作总结 2016抚养子女协议书 第一次作亏心事 放手,不是因为不爱,而是因为更懂你 毕业祝福语朋友 安全制度 放假喽 直到 物业公司实习报告(一) 我是一棵小树苗 [KUIK日记]简阳石桥古镇游记 世界卫生日国旗下的讲话----城市化与健康 五条禁令心得体会精选范文 二年级作文秋天来了 郑板桥教我们去薄存厚 民俗的作文 小学五年级作文500字:我爱水仙花 一种叫保养的品德 想爱恋了... 酒店火灾应急预案 感恩父母作文750字 导演的“苍蝇思维” 奶奶家的百菜园 县对外贸易经济合作局作风整顿领导班子剖析材料 华露 有关写国庆节晚会的观后感800字 入党自传2 虞美人(己亥春) 张小娴的经典爱情语录 职场:“高职高薪”者如何闯关? 背乘法口诀 暑假社会实践报告-药店销售 机械工程及自动化专业实习报告 项目成本管理过程中应注意的几个问题 我写下的每个字都是梦想 美丽的初秋,神秘的向往作文450字 冰雪公主(五) 初中初一作文450字:我与简·爱的对话_中学生作文 真诚的一声对不起作文450字 去姥姥家玩作文200字 美丽的高邮我的家作文750字 我会坚强,坚强到让你心疼 夜温白颐路 小学六年级作文600字:天桥上有乞丐 小班健康活动教案:会跳舞的跳跳糖 安全第一450字

Copyright © 2016 phpStudy |