重写(Override)
重写就是在子类里去编写父类中的方法(允许子类访问的方法),其重写的方法的返回值和形参都要与父类的一模一样。
方法重写的规则
- 重写方法的方法名称、参数列表必须与父类方法的相同,返回类型可以相同,也可以是原类型的子类型。
- 重写方法不能比原方法访问性差(即访问权限不允许缩小)。
- 被重写的方法不能是final类型,因为final修饰的方法是无法重写的。
- 被重写的方法不能为static。如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足重写条件,那么会发生编译错误;反之亦然。即使父类和子类中的方法都是静态的,并且满足重写条件,但是仍然不会发生重写,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。
- 构造方法不能被重写。
- 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
- 重写 override 针对方法,必须建立在继承基础之上,
- 如果子类拥有与父类相同的方法,则子类调用时就会覆盖从父类继承过来的方法。
People.java
public class People{
public void eat() {
System.out.println("People eat");
}
}
Man.java
public class Man extends People {
// 重写的方法
public void eat() {
System.out.println("Man eat");
}
}
Test.java
public class Test {
public static void main(String[] args) {
// 测试重写的方法
Man laosunMan = new Man();
laosunMan.eat();
}
}
输出结果:
重载(Overload)
方法重载的原则:
- 被重载的方法必须改变参数列表(参数个数或类型不一样);
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个子类中被重载。
- 无法以返回值类型作为重载函数的区分标准。
- 重载最普遍的运用是输出语句的使用,当参数不同,调用方法不同。
People.java
public class People {
// 多个构造方法,也称为重载,因为名字相同,只是参数个数和参数类型不同。
// 求和
// 2个数和
public int sum(int value1, int value2) {
return value1 + value2;
}
// 3个数和
public int sum(int value1, int value2, int value3) {
return value1 + value2 + value3;
}
public double sum(int value1, double value2) {
return value1 + value2;
}
}
Test.java
public class Test {
public static void main(String[] args) {
People zhangsanPeople = new People();
// 多态的表现:看起来调用的是相同的方法名,但是根据传递的参数个数不同,将来执行不同的方法。
int resultValue1 = zhangsanPeople.sum(1, 2);
int resultValue2 = zhangsanPeople.sum(1, 2, 3);
// 根据传递的类型,执行的是不同的方法。
double resultValue3 = zhangsanPeople.sum(1, 2.0);
System.out.println(resultValue1);
System.out.println(resultValue2);
System.out.println(resultValue3);
}
}
输出结果:
注:
多态的表现:看起来调用的是相同的方法名,但是根据传递的参数个数不同,将来执行不同的方法。
重载、重写都是简单地多态,重载也就是调用方法时的多态。
重载和重写的区别
重写(Override) | 重载(Overload) | |
---|---|---|
方法名一样,返回类型一样 | 方法名一样,返回类型不一样 | |
发生在继承中 | 在一个类中 | |
参数类型相同 | 参数类型或个数不同 | |
被重写的方法不能拥有比父类更加严密的权限 | 无要求 |