多态是指,在子类继承父类之后,可以覆写父类中的方法,在多个子类调用覆写之后,会存在多个同名的方法。即多态指的是在调用某个类型的方法时,是基于运行时实际类型的动态调用,这就称之多态。
方法名相同,参数相同,返回值不同,属于不同的方法,重写时,可以通过加@Override,防止自己重写的方法错误。
(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(); } }
子类覆写方法之后,还想调用父类的方法,则需要使用super.方法名(参数);
当方法,字段名之前加入final,则子类不可以对于父类的有final字段的进行调用、继承和覆写。
当实例化对象之后,带有final字段就不可更改。有final的方法不可以重写,有final的类不可以被继承。
有final的字段,可以在构造方法中初始化final字段。