- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多态_重载_覆盖的区别
多态 重载 覆盖 区别
所谓多态,是指一个程序中同名的不同方法共存的情况。通过继承,一个类可以
用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任
何接口类型。这称为多态性。面向对象的程序中多态的情况有多种,可以通过子
类对父类方法的覆盖实现多态,也可以利用重载在同一个类中定义多个同名的不
同方法。
方法的覆盖:子类对继承自父类的方法的重新定义。
重载:同一个类中定义多个同名方法的情况。
多态情况下进行方法的调用时,如何区分这些同名的不同方法呢?
在覆盖中,由于同名的不同方法是存在于不同的类中,所以只需要在调用方法时,
指明调用的是哪个类的方法,就可以很容易地把它们区分开来。而在重载多态中,
由于重载发生在同一个类中,不能再用类名来区分不同的方法,所以一般采用不
同的形式参数列表,包括形式参数的个数、类型、顺序的不同,来区分重载的方
法。
另外看到一个有趣的说法是:继承是子类使用父类的方法,而多态则是父类使用
子类的方法。
例子如下:
class Triangle extends Shape {
public int getSides() {
return 3;
}
}
class Rectangle extends Shape {
public int getSides(int i) {
return i;
}
}
public class Shape {
public boolean isSharp(){
return true;
}
public int getSides(){
return 0 ;
}
public int getSides(Triangle tri){
return 3 ;
}
public int getSides(Rectangle rec){
return 4 ;
}
public static void main(String[] args) {
Triangle tri = new Triangle();
System.out.println(Triangleisatypeofsharp?+tri.isSharp());
Shape shape = new Triangle();
System.out.println(My shape has + shape.getSides() + sides.);
}
}
红色是重载,绿色是重写,蓝色是继承,粉红是多态
注意Triangle类的方法是重写,而Rectangle类的方法是重载。
比较红色的和粉红的部分就可以发现多态对重载的优点:如果用重载,则在父类
里要对应每一个子类都重载一个取得边数的方法;如果用多态,则父类只提供取
得边数的接口,至于取得哪个形状的边数,怎样取得,在子类里各自实现(重写)。
重载和覆盖的区别:
“overload(重载)”:
1、overload方法名时参数类型、个数、顺序至少有一个不相同;
2、不能overload只有返回值不同的方法名;
3、overload存在于父类和子类、同类中。
“override(覆盖)”
1、override时,方法名、参数、返回值相同;
2、子类方法不能缩小父类方法的访问权限;
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常);
4、override存在于父类和子类之间。
方法名,参数相同形成重写,重写的方法不能降低原方法的可见度,也不能改
变原方法的返回值类型。
方法名相同,参数不同(个数、类型)形成重载,重载的方法可看成一个全新的方
法,与原方法相比它可以有不同的可见度和“返回值类型”。如下例:
class A {
protected int method1(int a, int b) { return 0; }
}
public class B extends A{
public int method1(int a, int b) { return 0; } //正确,重写父类方法,
可以扩大访问权限
//private int method1(int a, int b) { return 0; } //错误,重写父类方
法,不能降低了访问权限
//private long method1(int a, int b) { return 0; } //错误,重写父类
方法,不能改变返回值类型
public short
文档评论(0)