A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王进亮 中级黑马   /  2012-12-20 17:38  /  1866 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王进亮 于 2012-12-22 20:25 编辑

谁能告诉我,重载和重写的区别,可以详细一点,最好举个例子.........

8 个回复

倒序浏览
重载:
构造函数的名字和它从属的类的名字相同。
对象和方法的名字有时候会面临重载的需要,例如类的构造函数的引入,因为有时候会需要使用几种不同的方法来创建对象,例如既能用标准的无参数方法来初始化,又可以使用带String类型的参数的方法来读取磁盘上的配置文件来初始化,这就需要建立两个构造函数,它们的名字是相同的,于是就牵出了方法重载的要求。
如:
class Plant{
int height=0;
Plant(){
     System.out.println("Plant a seed.");
     height=0;
}
Plant(int i){
     System.out.println("Plant a tree that's "+i+" feet tall.");
     height=i;
}
void detail(){
     System.out.println("The tree is "+height+" feet tall.");
}
void detail(String s){
     System.out.println(s+": The tree is "+height+" feet tall.");
}
}

class OverloadingTest{
public static void main(String[] args){
     new Plant();
     for(int i=0;i<3;i++){
      Plant tree=new Plant(i);
      tree.detail();
      tree.detail("Overloaded method");
     }
}
}
区分重载的方法:如果出现多个重载,那么Java将以不同的参数类型列表来区分不同的重载。
如:void Plant(String s , int i)与void Plant(int i , String s)就是不同的重载。
不能使用返回值判断重载
       可以想像如果根据不同的返回值来判断不同的重载也许可行,但是如果调用方法不是为了获得其返回值,而是为了得到其“副作用”,那么根据返回值类型来判断重载就会遇到麻烦。
       即如果你这样定义一个重载:
void f() {}
int f() {}
在关心返回值的情况下,使用int x = f()可以正确调用下面那个方法,但是如果不关心返回值,直接使用 f() 的话编译器就无法正确判断你究竟想调用哪个方法。



重写:
父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
重写注意点:
1、必须是子类继承父类,在子类中重写父类的方法
2、方法名、返回值类型、参数个数、参数类型都必须相同,抛出异常的允许情况也必须相同,一句话,只有方法里面的功能语句可以不同。
3.、子类重写父类的方法的访问修饰符不能低于父类。

评分

参与人数 1技术分 +1 收起 理由
邵天强 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
重载和重写根本就不能拿来做比较,重载是用在同一个类中的,而重写是在两个继承关系的类中的。没有什么可比性
回复 使用道具 举报
重载表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

重写表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

     对于重载如果两个方法的参数列表完全一样,但它们的返回值不同来,不能构成实现重载,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。

在重写时要注意以下的几点:

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


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

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

评分

参与人数 1技术分 +1 收起 理由
邵天强 + 1 很给力!

查看全部评分

回复 使用道具 举报
一、重载(overload)。
      1、定义:重载就是一个类中有多个同名的函数,每个函数都有不同的参数类型和参数个数
      例如:
  1. class OverLoadDemo
  2. {
  3. public void method()
  4. {
  5. }
  6. public void method(String p)
  7. {
  8. }
  9. public void method(String[] p)
  10. {
  11. }
  12. public void method(String p,int p1)
  13. {
  14. }
  15. public void method(int p1,String p)
  16. {
  17. }
  18. }
复制代码
2、重载要注意的事项
            1、重载跟返回值无关,仅管反回值不同,但只要函数名和参数列表是相同的,就只能定义一种。
            2、重载跟异常无关,仅管异常不同但,但只要函数名和参数列表是相同的,就只能定义一种。
二、重写(override)。
    1、定义:重写发生在继承里,即重写发生在父类和子类之间。子类函数的方法名和父类的非私有,非终态的函数名重名时,这种情况就是子类重写父类的函数。
    例如:
  1. class OverrideDemo
  2. {
  3.     public void method()
  4.     {
  5.     }
  6. public void method(byte )
  7. {
  8. }
  9. public void method(String[] p)
  10. {
  11. }
  12. public void method(String p,int p1)
  13. {
  14. }
  15. public void method(int p1,String p)
  16. {
  17. }
  18. }
  19. class Child extends OverrideDemo
  20. {
  21. //重写父类的 method方法.
  22. public void method(int p1,String p)
  23. {
  24. }
  25. }
复制代码
2、重写要注意的事项。
       1、重写的前提是要有继承关系。没有继承就谈不上重写。
       2、子类不能重写父类的私有成员,即使定义也只能说明重新定义在子类中的一个新的函数而已,因为子类无法继承父类的私有方法。
       3、子类不能得写父类的终态函数,即使定义也只能说明重新定义在子类中的一个新的函数而已,因为子类无法继承父类的终态方法。
       4、用final修饰的方法不可以被子类继承。
       5、子类重写父类的方法,其修包饰权限只能大于等于父类的修饰权限,而不能小于父类的修饰权限
       6、子类重写父类的方法,其抛出的异常只以是父类的异常或异常子类。
       7、子类重写父类的方法,其输入参数可以被放大,就是说参数可以是其类型本身的父类。
       8、子类重写父类的方法,其输出参数可以被缩小,就是说参数可以是其类型本身的子类。

如有错的地方,期待与你交流。
      

评分

参与人数 1技术分 +1 收起 理由
邵天强 + 1 赞一个!

查看全部评分

回复 使用道具 举报
重写是子类的方法覆盖父类的方法,要求方法名和参数都相同

重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同,最常见的重载的例子就是类的构造函数,可以参考API帮助文档看看类的构造方法
回复 使用道具 举报
重写是子类的方法覆盖父类的方法,要求方法名和参数都相同

重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同,最常见的重载的例子就是类的构造函数,可以参考API帮助文档看看类的构造方法
回复 使用道具 举报
重写一般是指父类和子类之间,子类重写了父类的一个方法,当然方法名是一样的,而且不能改变父类方法的返回值,比如说父类是返回String,子类重写了这个方法,想返回一个int,那是不行的,也得返回String。

重载是一个类里面,写了多了同名的方法,各个方法的返回值类型可以不一样。要注意区分重载方法可以通过参数列表的个数,类型和顺序。但是不推荐用顺序来进行重载,这会让代码可读性极差。
回复 使用道具 举报
可以用多态来简单的理解,重写方法是类的多态表现,而重载方法则是一个类中方法的多态体现。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马