黑马程序员技术交流社区

标题: JAVA语言中,重写<Overriding>和重载<Overloading>,他俩之间有何... [打印本页]

作者: HM张勇    时间: 2013-4-3 10:40
标题: JAVA语言中,重写<Overriding>和重载<Overloading>,他俩之间有何...
本帖最后由 HM张勇 于 2013-4-3 13:20 编辑

JAVA语言中,重写<Overriding>和重载<Overloading>,他俩之间有何联系和区别呢?在什么情况下使用呢?




作者: 林庆松    时间: 2013-4-3 10:55
重写方法的规则:
1.参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.
2.返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载.
3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常.例如,
父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常.

而重载的规则:
1.必须具有不同的参数列表;
2.可以有不同的返回类型,只要参数列表不同就可以了;
3.可以有不同的访问修饰符;
4.可以抛出不同的异常;

重写和重载的区别在于:

重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值
作者: 刘渝灵    时间: 2013-4-3 11:38
寡人的总结,仅供参考。
1.方法的覆盖子类继承父类时,子类沿袭父类的某个功能,但功能的内容已经不同,这时需要对父类的功能进行重写,也即覆盖。覆盖要求子类中的方法和父类中的一模一样。这个一模一样要求方法返回类型,方法签名(即方法的名称,参数的类型,顺序和个数)要和父类完全一致,访问权限要大于等于父类(原因下边会重点解释),抛出的异常必须是父类的子类和子集。如果父类中的方法是private的,则不存在覆盖。另外,静态只能覆盖静态。

2.方法的重载方法的重载是指,在同一个类中存在多个方法名称相同但参数的类型,顺序和个数不同的方法。不能按访问权限和返回值类型来区分重载,如果方法签名相同而仅仅只是访问权限或者返回值类型不同,则编译失败。

注意:java中不存在成员变量的覆盖,当子类中出现和父类同名的成员变量时,父类成员变量被隐藏。可以用super关键字或者父类的方法去访问父类中的同名变量。
为什么子类覆盖父类的方法时,访问权限只能大于等于父类的权限?
从原因上说,这是多态和后期维护的需要。java中子类类型的实例对象是能够被当做父类类型来使用的。考虑下面的情况:
包packa中有下面两个类:
[java] view plaincopy


  • public class Fu{  
  •       public void show(){}  
  • }  
  • public class Zi extends Fu{  
  •        void show(){}  
  • }  

包packb中有下面的调用:

[java] view plaincopy


  • void method(Fu f){  
  •         f.show();  
  • }  

如果往method方法中传入new Zi()对象,则f无法调用show方法,因为Zi类中的show方法只能在同一个包中访问。



作者: 程媛媛    时间: 2013-4-3 11:45
方法重载与方法覆盖的相同点:
1,方法名相同。
2,可以用于抽象方法与非抽象方法之间。
方法重载与方法覆盖的不同点:
1,方法覆盖要求参数类型、参数个数、参数顺序必须一致,而方法重载要求参数类型、参数个数、参数顺序至少有一项不同。
2,方法覆盖要求返回类型必须一致,而方法重载可以不同。
3,方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类的所有方法。
4,方法的覆盖对方法的访问权限不能小于父类的访问权限,对抛出的异常不能超出父类的异常范围,而方法重载不做任何限制。
5,父类的一个方法只能被一个子类覆盖一次,而一个方法在所在类中可以被重载多次,包括从父类继承的方法。

下面对方法重载举例说明:
class Based{
public void get(String s,int age){
System.out.println(s+":"+age);
}
}
class Dem extends Based {

public int add(double a,int c){//add()方法可以重载多次
return (int)a+c;
}
public double add(int c,double a){//参数顺序不同,放回类型可以不同
return a+c;
}

long add(long a,long b){//参数类型不同,访问权限不受限制
return a+b;
}
public int add(int a,int b,int c){//参数个数不同
return a + b + c;
}

public void get(int age,String s){//可以重载从父类中继承来的方法
System.out.println(age+":"+s);
}
}

方法覆盖举例说明:
class Base1{
public void show(String name,int age){
System.out.println("base...method.........."+name+":"+age);
}
}
class Sub extends Base1{
public void show(String name,int age){//方法名相同,参数类型、参数个数、参数顺序相同
System.out.println("sub.....method..."+name+":"+age);
}

}
作者: 黄玉昆    时间: 2013-4-3 12:52
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢




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