黑马程序员技术交流社区

标题: 重载和重写 [打印本页]

作者: natalie    时间: 2013-8-7 09:30
标题: 重载和重写
本帖最后由 杨兴庭 于 2013-8-7 18:00 编辑

请问各种大大~重载和重写有什么区别。。总是分不清。。最好有个小程序的例子 便于区分~
作者: 张智文    时间: 2013-8-7 09:45
一、重载(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、子类重写父类的方法,其输出参数可以被缩小,就是说参数可以是其类型本身的子类。

不足之处望指正,互相交流      





作者: 熊纪达    时间: 2013-8-7 09:52
1,重载只同名函数的参数列表,只要参数类型不同或者个数不一样就算俩个函数,也就是重载。
2,重写一般出现在子类方法中,子类继承父类并重写父类的方法。函数名,返回值类型以及参数类型和个数必须一模一样。
  1. class Person
  2. {
  3.         public void show()
  4.         {
  5.                 System.out.println("haha");
  6.         }
  7. }
  8. class Student extends Person
  9. {
  10.         public void show()               //重写父类show方法,函数名必须一模一样。
  11.         {
  12.                 System.out.println("heihei");
  13.         }
  14.         public void show(int a)          //该方法和子类中的show()方法属于重载。参数列表不一样。
  15.         {
  16.                 System.out.println("xixi");
  17.         }

  18. }
复制代码

作者: 草帽    时间: 2013-8-7 11:39
网上找了个综合的:override->重写(=覆盖)、overload->重载、polymorphism -> 多态
override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。
重写(覆盖)的规则:
1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.
2、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。
3、重写的方法的返回值必须和被重写的方法的返回一致;
4、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;
5、被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。
6、静态方法不能被重写为非静态的方法(会编译出错)。

overload是重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。
重载的规则:
1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样);
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;

多态的概念比较复杂,有多种意义的多态,一个有趣但不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。
一般,我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。
  1. public class Shape
  2. {
  3.         public static void main(String[] args){
  4.                 Triangle tri = new Triangle();
  5.                 System.out.println("Triangle is a type of shape? " + tri.isShape());// 继承
  6.                 System.out.println("My shape has " + shape.getSides() + " sides."); // 多态
  7.                 Rectangle Rec = new Rectangle();
  8.                 Shape shape2 = Rec;
  9.                 System.out.println("My shape has " + shape2.getSides(Rec) + " sides."); //重载
  10.         }
  11.         public boolean isShape(){
  12.                 return true;
  13.         }
  14.         public int getSides(){
  15.                 return 0 ;
  16.         }
  17.         public int getSides(Triangle tri){ //重载
  18.                 return 3 ;
  19.         }
  20.         public int getSides(Rectangle rec){ //重载
  21.                 return 4 ;
  22.         }
  23. }
  24. class Triangle extends Shape
  25. {
  26.         public int getSides() { //重写,实现多态
  27.                 return 3;
  28.         }
  29. }
  30. class Rectangle extends Shape
  31. {
  32.         public int getSides(int i) { //重载
  33.                 return i;
  34.         }
  35. }
复制代码





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