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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 柳雷 中级黑马   /  2012-7-20 00:49  /  1550 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 柳雷 于 2012-7-20 06:43 编辑

override和overload区别的完整回答,要求完整

4 个回复

倒序浏览
本帖最后由 陈欢 于 2012-7-20 01:03 编辑

关于重写和重载在编程中会经常用到,也是比较容易混淆的,大概总结了一下:

方法的重写(Override)和重载(Overload)是Java多态性的不同表现。
重写(Override)是父类与子类之间多态性的一种表现,而重载(Overload)是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Override)
。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了.
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型或有不同
的参数次序,则称为方法的重载(Overload)。不能通过访问权限、返回类型、抛出的异常
进行重载.
1. Override 特点
1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
2.Overload 特点
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。


用如下代码表示下两者的区别:
overload在同一个类中具有相同方法(函数)名的不同签名的实现,也就是说方法的名字相同,但参数类型,个数都不相同的(不包括返回类型),如下就是重载
public double GetValue()
{
}
public int GetValue(string s)
{
}

override是在子类中实现父类中的virtual方法(属性也可),或者是abstract方法(属性也可以),如下:
public class A
{
   public virtual void SetValue(string str)
  {
  }
}
public class B:A
{
   string mumber;
   public override void SetValue(string str)
   {
     number = str;  
   }
}

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
重写就是覆盖,要跟父类中返回值,参数都必须一样.
重载就是在一个类当中,不同参数类型,不同参数数量的同名函数
两者关系不大
回复 使用道具 举报
方法覆盖,子类沿袭父类的方法。静态只能覆盖静态,
方法覆盖,子类方法的权限必须大于等于父类的权限,才可以覆盖。
重载只看同名函数的参数列表。
重写子父类方法要一模一样。
回复 使用道具 举报
方法重载(overload):对于类的方法(包括从父类继承的方法),如果有两个方法的方法名相同,但参数不一致,那么可以说,一个方法是另一个方法的重载方法。
重载满足以下条件:
方法名相同
方法的参数类型、个数、顺序至少有一项不相同
方法的返回类型可以不同
方法的修饰符可以不同

方法覆盖(Override):如果在子类中定义的一个方法,其名称、返回类型及参数签名(参数的类型、个数和顺序)正好和父类中的某个方法的名称、返回类型及参数签名相匹配,那么,可以说子类覆盖了父类的方法。
必须满足多重约束:
1、子类方法的名称、返回类型及参数签名必须与父类方法的名称、返回类型及参数签名一致
2、子类方法不能缩小父类方法的访问权限
3、子类方法不能抛出比父类更多的异常
4、方法覆盖只存在于子类和父类之间,在同一个方法中只能被重载,不能被覆盖
5、父类的静态方法不能被子类覆盖为非静态方法
6、子类可以定义与父类静态方法同名的静态方法,以便在子类中隐藏父类的静态方法,在编译时,子类定义的静态方法也必须满足与方法覆盖类似的约束:方法的参数签名一致,返回类型一致,不能缩小父类方法的访问权限,不能抛出更多的异常
7、父类的非静态方法不能被子类覆盖为静态方法
8、父类的私有方法不能被子类覆盖
9、父类的抽象方法可以被子类通过两种途径覆盖:一是子类实现父类的抽象方法;二是子类重新声明父类的抽象方法
10、父类的费抽象方法可以被覆盖为抽象方法

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马