1.多态的定义
多态是指,在子类继承父类之后,可以覆写父类中的方法,在多个子类调用覆写之后,会存在多个同名的方法。即多态指的是在调用某个类型的方法时,是基于运行时实际类型的动态调用,这就称之多态。
2.注意事项
方法名相同,参数相同,返回值不同,属于不同的方法,重写时,可以通过加@Override,防止自己重写的方法错误。
3.覆写方法
(1).覆写自己写的方法
例如:
将收入报税,每个类型的收入,所需要的缴纳的税率不同
定义普通收入
class Income {
protected double income;
public double getTax() {
return income * 0.1; // 税率10%
}
}
工资收入所需缴纳的税额:
class Salary extends Income {
@Override
public double getTax() {
if (income <= 5000) {
return 0;
}
return (income - 5000) * 0.2;
}
}
对于国务院特殊津贴,全部免税
class StateCouncilSpecialAllowance extends Income {
@Override
public double getTax() {
return 0;
}
}
所需要报税的计算
public double totalTax(Income... incomes) {
double total = 0;
for (Income income: incomes) {
total = total + income.getTax();
}
return total;
}
主方法中则需要调用对应的类型收入方法,传值计算
public class Main {
public static void main(String[] args) {
// 给一个有普通收入、工资收入和享受国务院特殊津贴的小伙伴算税:
Income[] incomes = new Income[] {
new Income(3000),
new Salary(7500),
new StateCouncilSpecialAllowance(15000)
};
System.out.println(totalTax(incomes));
}
(2).覆写Object方法
Object方法中有几个重要的定义的方法
1.toString():转换成字符串
2.equal():判断两个instance是否逻辑相等;
3.hashCode():计算一个instance的哈希值。
在必要的时候可以对于Object进行一个覆写
class Person {
...
// 显示更有意义的字符串:
@Override
public String toString() {
return "Person:name=" + name;
}
// 比较是否相等:
@Override
public boolean equals(Object o) {
// 当且仅当o为Person类型:
if (o instanceof Person) {
Person p = (Person) o;
// 并且name字段相同时,返回true:
return this.name.equals(p.name);
}
return false;
}
// 计算hash:
@Override
public int hashCode() {
return this.name.hashCode();
}
}
4. 调用super
子类覆写方法之后,还想调用父类的方法,则需要使用super.方法名(参数);
5.final
当方法,字段名之前加入final,则子类不可以对于父类的有final字段的进行调用、继承和覆写。
当实例化对象之后,带有final字段就不可更改。有final的方法不可以重写,有final的类不可以被继承。
有final的字段,可以在构造方法中初始化final字段。