用简单的话来说方法重载(Overloading)就是在同一个类中,方法的名字相同,但参数列表即参数个数、参数的类型不同,对返回值没有要求,方法重写(Overriding)是指子类和父类的关系,子类重写了父类的方法,但方法名、参数类型、参数个数必须相同。

      如果仅仅是需要粗浅的了解两者的区别上面的话相信已经能解决大部分人的问题了,但是做为进击的程序员我们当然不仅仅满足于此那么接下来我们着重分开来介绍一下两者的特点。


     首先是方法重载(Overloading)


(1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。

重载Overloading是一个类中多态性的一种表现。


(2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。

调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。


(3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。


下面通过一个实例来分析。
重载的定义和使用方法。

Class Person {
 {String name;
 int age;
 void print(){
 System.out.println("姓名:" +name+"年龄:" +age);
 }
 void print(String a,int b){
 System.out.println("姓名:" +a+"年龄:"+b);
 void print(String a,int b,intC){
 System.out.println("姓名:"+a+"年龄:" +b+"ID号:" +c);
 }
 void print(String a,int b,doubleC){
 System.out.println("姓名:"+a+"年龄:" +b+"ID号:"+c);
 }
 }

 public class OverLoadExampleOL
 {publicstaticvoidmain(String args[])
 {Personpl=newPerson();
 p1.nanle="李明";
 p1.age=22;
 p1.print();
 p1.print("王小早",19);
 p1.print("金波",18,100325);
 p1.print("婉宁",25,110903);
 }
 }


       在上面的程序中,可以看到Person类中有多个名为 void print的方法,这就是方法的重载。执行程序,运行结果如下:

姓名:李明年龄:22
姓名:王小早年龄:l9
姓名:金波年龄:18ID号:10 00325
姓名:婉宁年龄:25ID号:110903

      在方法重载时,方法之间需要存在一定的联系,因为这样可以提高程序的可读性,一般只重载功能相似的方法重载规则。重载是指我们可以定义一些名称相同的方法,通过定义不同的参数来区分这些方法,然后再调用时,Java虚拟机就会根据不同的参数列表来选择合适的方法执行。也就是说,当一个重载方法被调用时,Java用参数的类型和.. (或)个数来决定实际调用的重载方法。因此,每个重载方法的参数的类型或个数必须是不同。虽然每个重载方法可以有不同的返回类型,但返回类型并不足以区分所使用的是哪个方法。当Java调用一个重载方法是,参数与调用参数匹配的方法被执行。在使用重载要注意以下的几点:

1.在使用重载时只能通过不同的参数列表,必须具有不同的参数列表。例如,不同的参数类型,不同的参数个数,不同的参数顺序。当然,同一方法内的几个参数类型必须不一样,例如可以是 fun(int,float),但是不能为 fun(int,int)。
2.不能通过访问权限、返回类型、抛出的异常进行重载。
3.方法的异常类型和数目不会对重载造成影响。..
4.可以有不同的返回类型,只要参数列表不同就可以了。
5.可以有不同的访问修饰符。
6.可以抛出不同的异常。



    然后我们再来谈谈 重写(Overriding)


(1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。
但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。


      方法重写又称方法覆盖。


(2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。

如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。


(3)子类函数的访问修饰权限不能少于父类的;
下面是重写的例子:


class Person//定义父类
 fpublic void print(){//父类中的方法
 System.out.println( 父类Person的print方法! );
 }
 }
 class Student extends Person//定义子类继承Person类
 {public void print(){//方法的重写
 System.out.println( 子类Student的print方法! );
 }
 }
 public class 0verrideExampleO1
 {public static void main(String args[])
 {Student s=new Student();
 S.print();
 }
 }


运行结果:子类Student的print方法!

可以看出,当子类重写了父类中的print()方法后,使用S调用的是子类的print()方法,父类中的print()方法被覆盖了。也就是说,如果现在子类将父类中的方法重写了,调用的时候肯定是调用被重写过的方法,那么如果现在一定要调用父类中的方法该怎么办呢?此时,通过使用.. super关键就可以实现这个功能,super关键字可以从子类访问父类中的内容,如果要访问被重写过的方法,使用“super.方法名(参数列表)”的形式调用。

例如:

Class Person
 {public void print () {
 System.out.println( 父类Person的print方法! );
 }
 }
 class Student extends Person
 {public void print () {
 super.print(://访问父类中被子类覆写过的方法
 System.out.println(" 子类Student的print方法!" );
 }
 }
 public class OverrideExample02
 {public static void main(String args[])
 {Student s=new Student();
 S.print();
 }
 }


运行结果:父类Person的print方法!
子类Student的print方法 !
如果要使用super关键字不一定非要在方法重写之后使用,

也可以明确地表示某个方法是从父类中继承而来的。使用super

只是更加明确的说,要从父类中查找,就不在子类查找了。


重写方法的规则:

1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。

2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。

3、访问修饰符的限制不能小于被重写方法的访问修饰符(public>protected>default>private)

4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:

父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。



       最后来总结一下:

       重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值。灵活的运用方法重写与方法重载,不仅能减少编码的工作量,也能大大提高程序的可维护性及可扩展性。用好重写和重载可以设计一个结构清晰而简洁的类,从而体现变成的艺术。