方法重写:

    子类方法可以定义新的特征,当子类修改父类的方法进行扩展,增大功能,就需要进行方法重写的操作,重写建立在继承关系上,子类既可以隐藏和访问父类的方法,又可以覆盖继承父类的方法,覆盖继承父类的方法就是通过方法的重写来实现的。

    所谓的方法重写:子类中的方法与父类中继承的方法有完全相同的返回值类型,方法名,参数个数以及参数类型。

package javatest;

 class Parent {
     public void print(){
         System.out.println("parent class");
     }
 }

 class Child extends Parent{
     public void print(){
         System.out.println("Child class"); //输出Child class
     }
 }

 public class TestOverwrite{
     public static void main(String args[]){
         Child c = new Child();
         c.print();
     }
 }

输出结果:

Child class


子类重写过父类的方法后,使用c调用的方法一定是子类的方法, 父类中的方法被覆盖, 那么,如果现在想要调用父类的方法需要怎么做呢?

通过使用super关键字来实现。

package javatest;

 class Parent {
     public void print(){
         System.out.println("parent class");
     }
 }

 class Child extends Parent{
     public void print(){
         super.print();   //输出parent class
         System.out.println("Child class"); //输出Child class
     }
 }

 public class TestOverwrite{
     public static void main(String args[]){
         Child c = new Child();
         c.print();
     }
 }


输出结果:

parent class
Child class


总结重写规则:

    1、父类方法的参数列表必须与被子类重写的方法的参数列表完全相同;

    2、父类方法的返回类型必须与被子类重写的方法的返回类型完全相同;

    3、java中规定,被子类重写的方法不能拥有比父类方法更严格的访问权限。

    父类中的方法并不是任何时候都可以进行重写的,当父类方法的访问权限修饰符为private时,该方法只能被自己的类访问,不能被外部的类访问,在子类是不能被重写的。如果定义父类的方法为public,在子类定义为private,程序运行时会报错。

或者比被重写方法声明更加宽泛的检查型异常。例如,父类的一个方法申明了一个检查异常IOException,在重写这个方法时就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。


方法重载:

多态

    所谓的方法重载,在一个类中方法的名称相同,但是参数列表不同。参数列表不同指的是参数个数,参数类型或者参数顺序不同。

   

package javatest;

 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,int c){
         System.out.println("姓名:" + a + "  年龄:" + b + "  ID:" + c);
     }
 }
 public class TestOverload {
     public static void main(String args[]){
         Person p = new Person();
         p.name = "初始";
         p.age = 12;
         p.print();
         p.print("lucy", 23);
         p.print("toto", 33, 12890);
     }
 }


输出结果:

姓名:初始  年龄:12
姓名:lucy  年龄:23
姓名:toto  年龄:33  ID:12890


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

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

6.可以抛出不同的异常。



区别点

重载

重写(覆写)

英文

Overloading

Overiding

定义

方法名称相同,参数的类型或个数不同

方法名称、参数类型、返回值类型全部相同

对权限没有要求

被重写的方法不能拥有更严格的权限

范围

发生在一个类中

发生在继承类中