您的位置:首页 > 其它

重写、覆盖、重载、多态几个概念的区别分析

2014-11-07 11:42 447 查看

override->重写(=覆盖)、overload->重载、polymorphism
-> 多态

override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。

重写(覆盖)的规则:

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

2、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。

3、重写的方法的返回值必须和被重写的方法的返回一致;

4、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;

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

6、静态方法不能被重写为非静态的方法(会编译出错)。

overload是重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。

重载的规则:

1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样);

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

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

多态的概念比较复杂,有多种意义的多态,一个有趣但不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。

一般,我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。

举个例子:

public class Shape

{

public static void main(String[] args){

Triangle tri = new Triangle();

System.out.println("Triangle is a type of shape? " + tri.isShape());// 继承

Shape shape = new Triangle();

System.out.println("My shape has " + shape.getSides() + " sides."); // 多态

Rectangle Rec = new Rectangle();

Shape shape2 = Rec;

System.out.println("My shape has " + shape2.getSides(Rec) + " sides."); //重载

}

public boolean isShape(){

return true;

}

public int getSides(){

return 0 ;

}

public int getSides(Triangle tri){ //重载

return 3 ;

}

public int getSides(Rectangle rec){ //重载

return 4 ;

}

}

class Triangle extends Shape

{

public int getSides() { //重写,实现多态

return 3;

}

}

class Rectangle extends Shape

{

public int getSides(int i) { //重载

return i;

}

}

注意Triangle类的方法是重写,而Rectangle类的方法是重载。对两者比较,可以发现多态对重载的优点:

如果用重载,则在父类里要对应每一个子类都重载一个取得边数的方法;

如果用多态,则父类只提供取得边数的接口,至于取得哪个形状的边数,怎样取得,在子类里各自实现(重写)。

重写方法的规则如下:

1. 参数列表:必须与被重写方法的参数列表完全匹配。

2. 返回类型:必须与超类中被重写的方法中声明的返回类型或子类型完全相同

3. 访问级别:一定不能比被重写方法强,可以比被重写方法的弱。

4. 非检查异常:重写方法可以抛出任何非检查的异常,无论被重写方法是否声明了该异常。

5. 检查异常:重写方法一定不能抛出新的检查异常,或比被重写方法声明的检查异常更广的检查异常

6. 不能重写标志为final,static的方法

重载方法的规则:

1. 参数列表:被重载的方法必须改变参数列表。

2. 返回类型:可以改变返回类型。

3. 修饰符:可以改变修饰符

4. 异常:可以声明新的或者更广泛的异常。

class Animal {
public void eat(){
}
}

以下列出对于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){} 可以通过编译,不是重写;是重载,首先参数列表必须发生变化,返回类型可以发生改变。

对父类被重写的方法做一个变动:

class Animal {
public Animal eat() throws IOException{
return null;
}
}

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的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具

有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型

来决定具体使用哪个方法, 这就是多态性。

(3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同

也可以不相同。无法以返回型别作为重载函数的区分标准。

2 重写(Overriding)

(1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某

方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,

子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不

动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又

称方法覆盖。

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

则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键

字引用了当前类的父类。

(3) 子类函数的访问修饰权限不能少于父类的;

总结:重载和重写(覆盖)。

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写

Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性

的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法

被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而

言,父类中的定义如同被“屏蔽”了,而且如果子类的方法名和参数类型和个数都和

父类相同,那么子类的返回值类型必须和父类的相同;如果在一个类中定义了多个同

名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载

(Overloading)。Overloaded的方法是可以改变返回值的类型。也就是说,重载的返回

值类型可以相同也可以不同。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: