java 函数的重载和重写实例代码
程序员文章站
2024-03-13 14:07:21
在java中多态分为两种编译时多态(重载)和运行时多态(重写),编译时多态又叫前绑定,运行时多态又叫后绑定。
下面用一个例子说明:
public class o...
在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 String的intern方法