重写(Override),也叫覆盖,是子类方法对父类方法的重新定义;
重载(Overload),同一类中同名方法拥有不同类型或个数的参数列表;
重载和重写的区别:
方法重写 | 方法重载 | |
---|---|---|
范围 | 子类 | 同一类中 |
返回类型 | 相同 | 无关 |
名称 | 相同 | 相同 |
参数 | 相同 | 不同 |
访问权限 | 子类大于等于父类 | 无关 |
被static修饰 | 不可以 | 可以 |
先摆个表,我们一项一项说:
范围
方法重写(Override):是子类重写或叫覆盖掉父类的方法,存在于继承关系的子类中;
方法重载(Overload):是存在于同一类中,同名方法之间的关系。
返回类型
方法重写(Override):子类中的方法也是就重写的方法必须要和父类的方法返回类型相同,或者返回父类方法返回类型的子类;
方法重载(Overload):和返回类型没得关系。
名称
方法重写和方法重载的名称必须完全相同,这点两者是一样的。
顺便提一下:
- 构造方法不能重写。(可以这样理解:因为构造方法的方法名必须和类名一样,和父类和子类的类名肯定是不同的。)
- 构造方法可以重载。(参数类型或者个数不同就成)
参数
方法重写(Override):参数的类型和个数必须一模一样。
方法重载(Overload):参数的类型或个数至少要有一个不一样。
访问权限
方法重写(Override):子类函数(重写的方法)的访问权限必须大于等于父类。
方法重载(Overload):和访问权限没得关系的。
被static修饰
方法重写(Override):被static修饰的方法是不能被重写的。只能被继承,不能被重写,加@Override注解编译会报错。
方法重载(Overload):可以被重载,没得影响的。
举两个例子:
重写/覆盖(Override):
//父类A
class A{
public void say(){
System.out.println("A");
}
}
//子类B继承A
class B extends A{
//重写A中方法
public void say(){
System.out.println("B");
}
}
//访问权限大于等于(此处相等),返回类型相同,函数名相同,方法体不同
重写就是子类重写父类方法的方法体,其它不变。
重载(Overload):
public String() {
this.value = "".value;
}
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
我找了一个String类的构造方法的重载,重载只有两个要求:
1、方法名相同;
2、参数类型或个数不同(类型不同、个数不同或都不同);
其它都没得关系的。