黑马程序员技术交流社区

标题: java中重载和重写的区别? [打印本页]

作者: Renica    时间: 2013-6-5 15:59
标题: java中重载和重写的区别?
今天被别人问了一个重载和重写的关系与区别,由于基础不好,没回答上来,求解。
作者: 夜默    时间: 2013-6-5 16:03
重载和覆盖(重写);重载就是在同一个类中定义多个同名不同形态的方法;覆盖是针对子类对父类方法的覆盖,在子类中对父类定义的方法重新定义,在子类中将隐藏来自父类的同形态方法。可以实用super关键字访问被子类覆盖的父类方法。所谓同形态是指方法名相同、参数列表相同(包括参数的类型、顺序、个数);反之则为不同形态。
作者: 张莹楠    时间: 2013-6-5 16:05
重载与重写的区别:
重写(overload),方法名称必须相同,参数也要相同。

重载(overread),方法名称必须相同,参数必须不同。

重写:是子类的方法覆盖父类的方法,要求方法名和参数都相同

重载:是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同。

作者: 刘晓    时间: 2013-6-5 16:06
方法的重载: 1、方法名必须一致
                 2、参数列表必须不同
              

方法的重写:子类可以根据需要重新实现父亲中的方法
                1、父子类之间
                2、方法名相同
                3、参数列表相同
               
作者: 王鑫    时间: 2013-6-5 16:16
重载:函数功能相同,参与运算内容不同。定义一个函数名表示功能,通过参数列表的不同来区分多个同名函数。
         重载和返回值类型无关。
重写:保留父类原有功能定义,重写功能内容。
         1.子类权限必须大于等于父类权限。
         2.静态只能覆盖静态。
         3.子父类函数必须一模一样。
作者: 郑锐    时间: 2013-6-5 16:21
重载就是在同一个类中定义多个同名不同形态的方法;覆盖是针对子类对父类方法的覆盖,在子类中对父类定义的方法重新定义,在子类中将隐藏来自父类的同形态方法。可以实用super关键字访问被子类覆盖的父类方法。所谓同形态是指方法名相同、参数列表相同(包括参数的类型、顺序、个数);反之则为不同形态。
作者: HM张勇    时间: 2013-6-5 18:11
本帖最后由 HM张勇 于 2013-6-5 18:29 编辑

重载就是同一个方法,方法内容没有改变,而是参数类型或者参数个数增加或者减少。
例如:

  1. <P>
  2. class FunctionOverload
  3. {</P>
  4. <P>public static void main(String[] args)
  5. {
  6.   add(4,5);
  7.   add(4,5,6);
  8. }
  9. //定义一个加法运算,获取两个整数的和。
  10. public static int add(int x ,int y)
  11. {
  12. return x+y;
  13. }

  14. //定义一个加法,获取三个整数的和。
  15. public static int add(int x ,int y,int z)
  16. {
  17. //return x+y+z;
  18. return add(x,y)+z;
  19. }</P>
复制代码
重写就是同一个方法,方法内容发生改变,被重新赋予新方法。

例如:

  1. <P>
  2. class Fu
  3. {
  4. void show()
  5. {
  6. System.out.println("fu shwo");
  7. }
  8. }
  9. class zi extends Fu
  10. {</P>
  11. <P>void show()
  12. {
  13. System.out.println("zi show");</P>
  14. <P>}
  15. }</P>
复制代码

作者: 朱志江    时间: 2013-6-5 19:56
特点:当子类出现和父类一模一样的函数时,
当子类对象调用该函数,会运行子类函数的内容。
如同父类的函数被覆盖一样。

这中情况是函数的另一个特性,重写(覆盖)

当子类继承了父类,沿袭了父类的功能到子类中。
但是子类虽有该功能,但是功能的内容却和父类不一致。
这时,没有必要定义新功能,而是使用覆盖特性,保留父类的功能定义并重写功能内容。

函数的重载(overload)
概念:在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。
特点:
什么时候用重载?
当定义的功能相同,但参与运算的未知内容不同。那么,这时就定义一个函数名称以表示其功能,方便阅读,而通过参数列表的不同区分多个同名函数.

覆盖(覆写)
1,子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。
(public>空>private。但是父类中如果是private,那么子类都不知道父类有,所以不能成为覆盖)
2,静态只能覆盖静态。

总结:
重载:只看同名函数的参数列表。
重写:子父类方法要一模一样(包括参数,啥乱七八糟的都一样哈\^_^/)
作者: ccywhut    时间: 2013-6-5 20:17
overload重载:在同一访问区里的同名函数,它们的参数个数、参数类型或参数顺序不同(即参数列不同),程序根据不同的参数列来确定具体调用那个函数,重载不关心函数返回值类型,与返回值无关。
override是覆盖:子类重新定义的函数,它的函数名、返回值、参数列(参数个数、参数类型或参数顺序)必须与父类要覆盖的函数严格一致,子类在调用这个同名函数时,会调用子类的覆盖版本,不再调用父类被覆盖的函数。

重载,它只是一种语法规则,与多态没直接关系,主要是系统在编译时能确定调用重载函数的哪个版本,即是编译多态。

覆盖是多态的体现,面向对象核心就是多态。我们编程最多的就是父类、子类,继承、实现的关系,很多情况就是子类去覆盖(重写)父类方法。
下面是个小例子:
public class Test3
         {
  public static void main(String[] args) {}
       public void f1(int i){}
在其后加上下面方法中的任意一个。
      1.  编译无法通过,参数类型相同,只是把i换成j而已,还有就是改变了返回值类型,但重载不关心函数返回值类型,所以编译器认为是覆盖了上面的方法,而在同一个类中JAVA是不允许方法 覆盖 的
      public int f1(int z){}                 //1编译不通过,覆盖
       public int f1(int i,int j){}               //2重载,可以
      public void f1(long i){}                //3重载  可以


作者: 孙鑫    时间: 2013-6-5 22:30
1.重写必须继承,重载不用。
2.重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同。
3.重写的方法修饰符大于等于父类的方法,重载和修饰符无关。
4.重写不可以抛出父类没有抛出的一般异常,可以抛出运行时异常。
作者: 风爽    时间: 2013-6-5 23:13
重写是和继承有关的多态。子类通过重写可以隐藏已继承的父类实例方法。方法重写是指子类中定义一个方法,这个方法的类型和父类的方法类型一致或者是父类的方法的类型的子类型(所谓子类型,是指如果父类的方法的类型是“类”,那么允许子类的重写方法的类型是“子类”),并且这个方法的名字、参数个数、参数的类型和父类的方法完全按相同。
重载:一个类可以有多个具有相同名字的方法,但这些方法的参数必须不同,即或者参数的个数不同,或者参数的个数不同。重载和返回类型无关,只看参数列表
作者: JerryDu    时间: 2013-6-5 23:36
重载:即同名不同参 1、方法名必须一致 2、参数列表必须不同(参数个数 顺序以及参数类型)
               

方法的重写:子类可以根据需要实现父亲中的方法 1、必须是子父类之间 2、方法名和参数列表相同
作者: Heart    时间: 2013-6-16 09:37
重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。


使用重写要注意以下的几点:

1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

使用重载要注意以下的几点:

1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

作者: HM张博文    时间: 2013-6-16 09:44
这个貌似我也不知道诶
作者: 孙百鑫    时间: 2013-6-22 01:28
楼主您好~帖子长时间未作出回答,我已经将您的帖子改成已解决。如果有问题的话可以私密我哦~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2