html5中文学习网

您的位置: 首页 > 网络编程 > java教程 » 正文

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

[ ] 已经帮助:人解决问题

在java中多态分为两种编译时多态(重载)和运行时多态(重写),编译时多态又叫前绑定,运行时多态又叫后绑定。QMzHTML5中文学习网 - HTML5先行者学习网

下面用一个例子说明:QMzHTML5中文学习网 - HTML5先行者学习网

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{} 

在此需要说明的是:QMzHTML5中文学习网 - HTML5先行者学习网

对于 A a2 = new B( );QMzHTML5中文学习网 - HTML5先行者学习网

 如果单独打印出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的子类)。QMzHTML5中文学习网 - HTML5先行者学习网
QMzHTML5中文学习网 - HTML5先行者学习网

以上就是对重写和重载的实例代码分析,希望对Java学习的同学有帮助。QMzHTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助