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); t.info(1,"测试1"); t.info("测试2",2); //参数顺序不同构成重载 t.info(1,2); //方法修饰符可以不同,方法返回值类型不影响重载 t.info(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(); t.info("测试1"); MyClassRoom r = new MyClassRoom (); r.info("测试2"); //方法覆盖 r.info("测试3",3); //不属于方法覆盖;严格意义上说,方法重载发生在一个类内部,因此也不属于方法重载。 }}