Java之Overload与Override讲解
Arrays是针对数组的工具类,可以进行 排序,查找,复制填充等功能。 大大提高了开发人员的工作效率。
1. 基本概念
1.1 方法重载(Overload)概念
- 定义:一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即参数个数、参数类型或参数顺序不同。重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
注意:参数顺序不同,也属于方法重载,这一点将在后文以java程序为进行说明。 - 规则:
1)方法名称必须相同;
2)参数列表必须不同,即参数个数、参数类型或参数顺序中任有一个不同。
3)方法的返回类型可以相同也可以不同,对此无限制。
4)若仅满足方法的返回类型不同,不属于方法重载。 - 补充说明:
1)仅仅参数名称不同,或方法类型不同,不构成重载。例如,int min(int x, int y)与int min(int z, int y)不构成方法重载,同理,int min(int x, int y)与void min(int z, int y)不构成方法重载。
2)构造方法的名字与类名相同,且构造方法无返回类型,构造方法可以重载。
3)声明为final的方法不能被重载。
4)声明为static的方法不能被重载,但是能够被在此声明。
5)main 方法也可以被重载。 - 方法重载的目的:
1)方法重载的主要好处就是,不用为了对不同的参数类型或参数个数,而写多个函数。多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数。
2) 重载的最直接作用是方便了程序员可以根据不同的参数个数,顺序,类型,自动匹配方法,减少写过个函数名或方法名的重复步骤。
1.2 方法重写(Override)概念
- 定义:在子类中定义一个方法,这个方法的类型和父类的方法的类型一致或是父类的方法的类型的子类型,并且这个方法的名字、参数个数、参数类型和父类的方法完全相同。子类如此定义的方法称为子类重写的方法(不属于新增的方法)。方法重写又叫方法覆盖。
- 补充说明:
1)发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)。
2)子类抛出的异常下不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)。
3)子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)。
4)如果子类想使用被隐藏的方法,必须使用关键字super。 - 方法重写的目的:
1)子类通过方法的重写可以隐藏继承的方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。
2)重写方法既可以操作继承的成员变量,也可以操作子类新声明的成员变量。
3)重写是为了增强类的重用性和复用性,扩展性;重写是对类中方法的扩充,因为继承用的是父类的东西,重写则不仅得到父类的东西,同时也加入了自己的东西。
2. 程序实例
2.1 方法重载
package com.test;
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();
}
}
2.2 方法重写
package com.test;
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); //不属于方法重写;严格意义上说,方法重载发生在一个类内部,因此也不属于方法重载。
}
}
3. 两者区别
3.1 对比表格
区别点 | 重写 | 重载 |
---|---|---|
参数列表 | 必须不同 | 必须相同 |
返回类型 | 无限制 | 必须相同 |
异常 | 可以修改 | 异常只能减少或删除 |
访问权限 | 可以修改 | 不可以降低方法的访问权限 |