方法覆写与方法重载
方法重载(Overload):方法名相同,参数不同
方法覆写(Override):方法名相同,参数相同,返回值相同。
可以在代码中表现出来,表达出希望覆写的意思:
@Override
多态
Java的方法调用总是作用于运行期对象的实际类型,这种行为称为多态(Polymorphic)。
特性:不确定性
运行期才能动态决定调用的子类方法。对某个类型调用某个方法,执行的实际方法可能是某个子类的覆写方法。
public class Main {
public static void main(String[] args) {
// 给一个有普通收入、工资收入和享受国务院特殊津贴的小伙伴算税:
Income[] incomes = new Income[] {
//type[] array
new Income(3000),
new Salary(7500),
new StateCouncilSpecialAllowance(15000)
};
System.out.println(totalTax(incomes));
}
public static double totalTax(Income... incomes){
//type...array
double total = 0;
for (Income income: incomes) {
//遍历 for(type element:array)
total = total + income.getTax();
}
return total;
}
}
class Income {
protected double income;
public Income(double income) {
this.income = income;
}
public double getTax() {
return income * 0.1;
}
}
class Salary extends Income {
public Salary(double income) {
super(income);
}
@Override
public double getTax() {
if (income <= 5000) {
return 0;
}
return (income - 5000) * 0.2;
}
}
class StateCouncilSpecialAllowance extends Income {
public StateCouncilSpecialAllowance(double income) {
super(income);
}
@Override
public double getTax() {
return 0;
}
}
调用super
在子类的覆写方法中,如果要调用父类的被覆写的方法,可以通过super来调用。例如:
class Person {
protected String name;
public String hello() {
return "Hello, " + name;
}
}
Student extends Person {
@Override
public String hello() {
// 调用父类的hello()方法:
return super.hello() + "!";
}
}
final
final不允许被修改:
一、final+方法
继承可以允许子类覆写父类的方法。
如果一个父类不允许子类对它的某个方法进行覆写,可以在方法前加final。用final修饰的方法不能被Override:
class Person {
protected String name;
public final String hello() {
return "Hello, " + name;
}
}
二、final+类
如果一个类不希望任何其他类继承自它,那么可以把这个类本身标记为final。用final修饰的类不能被继承:
final class Person {
protected String name;
}
三、final+属性
对于一个类的实例字段,同样可以用final修饰。用final修饰的字段在初始化后不能被修改。例如:
class Person {
public final String name = "Unamed";
}
参考链接
https://www.liaoxuefeng.com/wiki/1252599548343744/1260455778791232