overload 首先你得知道中文是什么意思,load加载,overload就是重载;

override 重写

overload就是在一个类中,一个方法可以有多个实现,根据参数的类型、顺序、个数来决定调用哪个方法;例如fun(int,string),fun(string,int),fun(int,int,int),都可以这样去写。实际中比方说两个数相加,add(int,int).有可能两个数是double型的,你就没有必要再写一个方法addDouble(double,double),可以利用重载的特性,add(double,double)重载这个方法。实际调用的时候会根据你的参数来决定调用哪个对应的方法去实现。


override就不一样了,他是父类跟子类方法之间的关系。比方说,父类中有个方法叫test(),但是子类中也用到这个方法,就是实现不一样。此时你完全没有必要去重新写一个方法。完全可以写一个方法也起名为test(),然后参数、返回值跟父类中保持一致,不过在权限、抛出的异常只能比父类具有更大的范围,或者是其子类。

------------------------------------------------------------------------------------------

Overload是重载的意思,Override是覆盖的意思,也就是重写。

重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。

子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

至于Overloaded的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?这个题目很模糊。如果几个Overloaded的方法的参数列表不一样,它们的返回者类型当然也可以不一样。

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

override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:

1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;

3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;

4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:

1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));

2、不能通过访问权限、返回类型、抛出的异常进行重载;

3、方法的异常类型和数目不会对重载造成影响;

4.对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

总之,重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。很重要的一点就是,Overloaded的方法是可以改变返回值的类型。希望对你有帮助。

------------------------------------------------------------------------------------

overload与override的区别:

java多态之Override :

Override(重写)是子类与父类的一种多态性体现。
Override允许子类改变父类的一些行为。
为什么需要Override:当父类不满足子类的一些要求时我们就需要子类对父类的一些行为进行重写。
例如:某公司里的员工的电话号码不允许对外公开,而销售人员(员工)的电话号码则需要对外公开。
这时我们就可以这样做:
Java代码 www.2cto.com
1.public class Employee {
2.
3. private String mobile;
4.
5. public Employee(String mobile) {
6. this.mobile = mobile;
7. }
8.
9. protected String showMess(){
10. return "电话号码:"+mobile;
11. }
12.}
public class Employee {

private String mobile;

public Employee(String mobile) {
this.mobile = mobile;
}

protected String showMess(){
return "电话号码:"+mobile;
}
}

员工类的showMess方法是protected的,所以位于其他包的对象是访问不到的。

然后定义一个销售人员的类(Sales),并继承Employee类

Java代码
1.public class Sales extends Employee{
2.
3. //子类除了具有父类的一些属性,也可以有自己的一些属性
4. private String msn;
5.
6. public Sales(String mobile,String msn) {
7. super(mobile);
8. this.msn = msn;
9. }
10.
11. @Override
12. public String showMess() {
13. return super.showMess()+"==msn:"+this.msn;
14. }
15.}
public class Sales extends Employee{

//子类除了具有父类的一些属性,也可以有自己的一些属性
private String msn;

public Sales(String mobile,String msn) {
super(mobile);
this.msn = msn;
}

@Override
public String showMess() {
return super.showMess()+"==msn:"+this.msn;
}
}

注意这时被覆盖的showMess方法的访问级别是public,可以被任何其他对象访问到。

关于Override有几点要注意的地方:
1.被覆盖方法的访问控制级别可以不一样。
例如上例父类的showMess方法的访问级别为protected的,而子类覆盖的showMess方法访问级别则为public的。

但子类的访问级别必须要高于父类被覆盖方法的访问级别,如果父类是public的而子类是protected的则是错误的。

2.方法被定义为private或static或final的则不能被覆盖。

3.方法的返回类型:子类的返回类型可以是更具体的对象,例如可以将Employee类的返回类型改为Object也正确。而倒过来则错误。

4.在方法调用时先会在子类中找覆盖的方法,如果子类中没有则会在父类中去找。

Java代码
1.public class Parent {
2.
3. private int num(int i,int j){
4. return i+j;
5. }
6.
7. public static void main(String[] args) {
8. Parent p = new Child();
9. System.out.println(p.num(1, 2));
10. }
11.}
12.class Child extends Parent{
13.
14. public int num(int x,int y){
15. return x-y;
16. }
17.}
public class Parent {

private int num(int i,int j){
return i+j;
}

public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.num(1, 2));
}
}
class Child extends Parent{

public int num(int x,int y){
return x-y;
}
}

这段代码的执行结果为什么呢?如果你回答-1则错了,正确答案是3。
为什么呢?因为父类的num方法是private的,所以不能被覆盖,所以子类的num方法不是一种Override,因此在子类找不到被覆盖的num方法就会执行父类的num方法。所以结果输出为3.


Java代码
1.public class Parent {
2.
3. public int test(){
4. //执行子类的num方法
5. return num(1,2);
6. }
7.
8. protected int num(int i,int j){
9. return i+j;
10. }
11.
12. public static void main(String[] args) {
13. Parent p = new Child();
14. System.out.println(p.test());
15. }
16.
17.}
18.class Child extends Parent{
19.
20. public int num(int x,int y){
21. return x-y;
22. }
23.}
public class Parent {

public int test(){
//执行子类的num方法
return num(1,2);
}

protected int num(int i,int j){
return i+j;
}

public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.test());
}

}
class Child extends Parent{

public int num(int x,int y){
return x-y;
}
}

那么这段代码的执行结果是-1,因为父类test方法调用的是子类的num方法。


java overload的原则 :
在java中overload要遵循两个原则:准确性和唯一性

例一:

public class TestOverLoad
{
public static void main(String[] args)
{
Test test = new Test();
test.print(null);
}
}

class Test
{

public void print(String some)
{
System.out.println("String version print");
}

public void print(Object some)
{
System.out.println("Object version print");
}

}

在这个程序中, test.print(null)中的null即是String又是Object,那么要执行那个函数呢?结果是它执行了 public void print(String some),原因就是准确性原则,String继承自Object.在java看来,在这个例子中说null是String类型的比说null是Object类型的更为准确.

例二:

public class TestOverLoad
{
public static void main(String[] args)
{
Test test = new Test();
test.print(null);
}
}

class Test
{

public void print(String some)
{
System.out.println("String version print");
}

public void print(Object some)
{
System.out.println("Object version print");
}

public void print(StringBuffer some)
{
System.out.println("StringBuffer version print");
}
}
在该例中,Test类多了一个函数,然而在编译时出现了错误.原因是该例违反了overload的唯一性原则

.String和StringBuffer之间不存在继承关系,因此不能说null属于它们两个中的那个类更准确,于是程序在执行时就会不知道该调用public void print(String some),还是该调用 public void print(StringBuffer some).