重载和重写(覆盖)的区别
重写⽅法的规则如下:
1. 参数列表:必须与被重写⽅法的参数列表完全匹配。
2. 返回类型:必须与超类中被重写的⽅法中声明的返回类型或⼦类型完全相同
3. 访问级别:⼀定不能⽐被重写⽅法强,可以⽐被重写⽅法的弱。
4. ⾮检查异常:重写⽅法可以抛出任何⾮检查的异常,⽆论被重写⽅法是否声明了该异常。
5. 检查异常:重写⽅法⼀定不能抛出新的检查异常,或⽐被重写⽅法声明的检查异常更⼴的检查异常
6. 不能重写标志为final,static的⽅法
重载⽅法的规则:
1. 参数列表:被重载的⽅法必须改变参数列表。
2. 返回类型:可以改变返回类型。
3. 修饰符:可以改变修饰符
4. 异常:可以声明新的或者更⼴泛的异常。
1. class Animal {
2.    public void eat(){
3.    }
4. }
以下列出对于Animal的eat⽅法各种重写重载实例,根据以上列出的规则,判断其是否合法(以下的⽅法都属于Animal的⼦类Horse的⽅法):
1. private void eat(){}  不能通过编译,⾮法重写,访问修饰符限制性变强;不属于重载,因为参数列表没有发⽣改变
2. public void eat() throw RuntimeException{}  能通过编译,属于重写,重写⽅法可以抛出任何⾮检查异常。
3. public void eat() throw IOException{}  不能通过编译,⾮法重写,重写⽅法⼀定不能抛出新的检查异常,或⽐被重写⽅法声明的检查异常更⼴的检查异常;不属于重载,参数列表必须发⽣变化才属于重载
4. public void eat(String food){}  能通过编译,不是重写;合法重载,因为参数列表发⽣改变了。
5. public String eat(){}  不能通过编译,不是重写,因为其返回类型;不是重载,因为参数列表没有发⽣改变。
6. public String eat(int n){} 可以通过编译,不是重写;是重载,⾸先参数列表必须发⽣变化,返回类型可以发⽣改变。
对⽗类被重写的⽅法做⼀个变动:
1. class Animal {
2.    public Animal eat() throws IOException{
3.        return null;
4.    }
5. }
7.  public Animal eat(){return null;}  可以通过编译,合法重写,可以不抛出异常,只要不抛出新的异常或更⼴泛的异常就可以。
8.  public Animal eat() throws FileNotFoundException{return null;} 可以通过编译,是重写,属于⼦类的⾮检查异常。
9.  public Animal eat() throws Exception{}  不可以通过编译,⾮法重写,抛出了更⼴泛的异常。
10.  public Horse eat() {} 可以通过编译,是重写,因为返回类型可以是被重写的返回类型的⼦类。
1          重载(Overloading)
(1)⽅法重载是让类以统⼀的⽅式处理不同类型数据的⼀种⼿段。多个同名函数同时
存在,具有不同的参数个数/类型。重载Overloading是⼀个类中多态性的⼀种表现。
(2)      Java的⽅法重载,就是在类中可以创建多个⽅法,它们具有相同的名字,但具
有不同的参数和不同的定义。调⽤⽅法时通过传递给它们的不同参数个数和参数类型
来决定具体使⽤哪个⽅法, 这就是多态性。
java重载(3)重载的时候,⽅法名要⼀样,但是参数类型和个数不⼀样,返回值类型可以相同
也可以不相同。⽆法以返回型别作为重载函数的区分标准。
2    重写(Overriding)
(1)⽗类与⼦类之间的多态性,对⽗类的函数进⾏重新定义。如果在⼦类中定义某
⽅法与其⽗类有相同的名称和参数,我们说该⽅法被重写 (Overriding)。在Java中,⼦类可继承⽗类中的⽅法,⽽不需要重新编写相同的⽅法。但有时⼦类并不想原封不动地继承⽗类的⽅法,⽽是想作⼀定的修改,这就需要采⽤⽅法的重写。⽅法重写⼜称⽅法覆盖。
(2)若⼦类中的⽅法与⽗类中的某⼀⽅法具有相同的⽅法名、返回类型和参数表,则新⽅法将覆盖原有的⽅法。如需⽗类中原有的⽅法,可使⽤super关键字,该关键字引⽤了当前类的⽗类。
(3)⼦类函数的访问修饰权限不能少于⽗类的;
总结:重载和重写(覆盖)。
⽅法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是⽗类与⼦类之间多态性的⼀种表现,重载Overloading是⼀个类中多态性的⼀种表现。如果在⼦类中定义某⽅法与其⽗类有相同的名称和参数,我们说该⽅法被重写 (Overriding)。⼦类的对象使⽤这个⽅法时,将调⽤⼦类中的定义,对它⽽⾔,⽗类中的定义如同被“屏蔽”了,⽽且如果⼦类的⽅法名和参数类型和个数都和
⽗类相同,那么⼦类的返回值类型必须和⽗类的相同;如果在⼀个类中定义了多个同名的⽅法,它们或有不同的参数个数或有不同的参数类型,则称为⽅法的重载(Overloading)。Overloaded的⽅法是可以改变返回值的类型。也就是说,重载的返回值类型可以相同也可以不同。