overload和override的区别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
overload和override的区别
1、重载(overload)和覆盖(override)是java多态性的两种不同表现⽅式
覆盖(Overriding)是⽗类与⼦类之间多态性的⼀种表现,⽽重载(Overloading)是⼀个类中多态性的⼀种表现如果在⼦类中定义某⽅法与其⽗类有相同的名称和参数,我们说该⽅法被重写 (Overriding) 。
⼦类的对象使⽤这个⽅法时,将调⽤⼦类中的定义,对它⽽⾔,⽗类中的定义如同被屏蔽了。
2、如果在⼀个类中定义了多个同名的⽅法,它们或有不同的参数个数或有不同的参数类型或有不同的参数次序,则称为⽅法的重载(Overloading)。
不能通过访问权限、返回类型、抛出的异常进⾏重载。
重载overload的特点就是与返回值⽆关,只看参数列表,所以重载的⽅法是可以改变返回值类型的。
1. Overload 特点
1、重载时通过不同的参数样式来区分。
例如,不同的参数类型,不同的参数个数,不同的参数顺序)
2、不能通过⽅法法⼈访问权限、返回类型、抛出的异常进⾏重载;
3、⽅法的异常类型和数⽬不会对重载造成影响;
4、对于继承来说,如果基类⽅法的访问权限为private,那么就不能再派⽣类中进⾏重载,只是⼀个新的⽅法⽽已。
2. Override 特点
1、覆盖的⽅法的标志必须要和被覆盖的⽅法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的⽅法的返回值必须和被覆盖的⽅法的返回⼀致;
3、覆盖的⽅法所抛出的异常必须和被覆盖⽅法的所抛出的异常⼀致,或者是其⼦类;
4、⽅法被定义为final不能被重写;
5、对于继承来说,如果某⼀⽅法在⽗类中是访问权限是private,那么就不能在⼦类对其进⾏重写覆盖,如果定义的话,也只是定义了⼀个新⽅法,⽽不会达到重写覆盖的效果。
(通常存在于⽗类和⼦类之间。
)
3. 重载(overload)和覆盖(override)主要区别:
1)覆盖是⼦类和⽗类之间的关系,是垂直关系;重载是同⼀个类中多个⽅法的联系属于⽔平的关系;
2)覆盖只能由⼀个⽅法或⼀对⽅法产⽣关系,重载是多个⽅法之间的联系;
3)覆盖要求参数列表相同;重载要求参数列表不同;
4)覆盖关系中,调⽤⽅法体是根据对象的类型(对象对应存储空间决定的);⽽重载是根据调⽤时的实参表与形参表来选择⽅法体的。
区别点覆盖重载
参数列表必须不同必须相同
返回类型⽆限制必须相同
异常可以修改异常只能减少或删除
访问权限可以修改不可以降低⽅法的访问权限
重载实例
class MyClass {
int height;
MyClass() {
System.out.println("调⽤⽆参数构造函数");
height = 4;
}
MyClass(int i) {
System.out.println("调⽤有参数构造函数");
height = i;
}
void info(int a, String s) {
System.out.println(s+":房⼦⾼度为 "+height + " ⽶");
}
void info(String s, int a) {
System.out.println("参数顺序不同构成重载:" +s + ": 房⼦⾼度为 " + height + " ⽶");
}
int info(int b, int a) {
System.out.println("⽅法修饰符可以不同" +": 房⼦⾼度为 " + height + " ⽶");
return a+b;
}
float info(int b, int a, float c) {
System.out.println("⽅法返回值类型可以不同" +": 房⼦⾼度为 " + height + " ⽶");
return a+b;
}
}
public class Ytt {
public static void main(String[] args) {
MyClass t = new MyClass(3);
(1,"测试1");
("测试2",2); //参数顺序不同构成重载
(1,2); //⽅法修饰符可以不同,⽅法返回值类型不影响重载
(1,2,6f); //⽅法返回值类型可以不同
//重载构造函数
new MyClass();
}
}
重写实例
class MyClass {
void info(String s) {
System.out.println("我是⽗类:"+s);
}
}
class MyClassRoom extends MyClass{
void info(String s) {
System.out.println("我是⼦类:"+s);
}
int info(String s,int c) {
System.out.println("我是⼦类:"+s);
return c;
}
}
public class Ytt {
public static void main(String[] args) {
MyClass t = new MyClass();
("测试1");
MyClassRoom r = new MyClassRoom ();
("测试2"); //⽅法覆盖
("测试3",3); //不属于⽅法覆盖;严格意义上说,⽅法重载发⽣在⼀个类内部,因此也不属于⽅法重载。
}
}。