当前位置: 移动技术网 > IT编程>开发语言>Java > java 函数的重载和重写实例代码

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

2019年07月22日  | 移动技术网IT编程  | 我要评论
在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学习的同学有帮助。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网