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 交通频道 作文范文 童年永驻我心中 朱自清散文:海行杂记 关于周末的祝福语 2015高一开学典礼讲话稿 单身,不是因为找不到恋人 绕水湄之清愁,点明月之烦忧 乡镇文化工作汇报 你若不离不弃,我必生死相依 写循环日记 春临大地(文/听海的人) 喜欢你,却又小心翼翼 一年级作文 我的风景 暑假打工该注意些什么 蓝色雪花泪 创业所需要的7大重要条件 椰子作文600字 小学五年级作文500字:我爱家乡的黄河大坝 我的新名字作文 有关青春的七堇年经典语录语句 汗水中励志作文600字 小学五年级作文500字:风 #183;影 母亲节的感受作文 励志电影推荐《一公升的眼泪》 丫头,我那永恒的爱恋 小学四年级作文400字:关羽 对加快餐饮业工作发展的思考 蜗牛背着重重的壳 作一个温柔的微笑来回应 慈善捐助超市开业仪式讲话稿 东北老工业基地国有经济的现状 卖报纸——难呀作文800字 经典语录:感情再深,不懂珍惜也会断! dnf魔法师2作文2800字 感谢老师的作文300字 2012学年上学期英语教学工作总结 我爱上了这习惯 当你幸福的离去 《威尼斯商人》读后感400字 忘不了那一夜作文800字 小学五年级作文450字:猫狗冤家 汕头市室内装饰设计合同 教师节历年大事记 教育故事案例 防溺水主题班会教案 2016工厂安全心得体会 校园的落叶作文 五年级《放牛班的春天》观后感 我的钢笔 2015最浪漫的爱情句子 家乡的习俗作文300字

Copyright © 2016 phpStudy |