多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。

    1. public class Main {
    2. public static void main(String[] args) {
    3. Person p = new Student();
    4. p.run(); // 应该打印Person.run还是Student.run?
    5. }
    6. }
    7. class Person {
    8. public void run() {
    9. System.out.println("Person.run");
    10. }
    11. }
    12. class Student extends Person {
    13. @Override
    14. public void run() {
    15. System.out.println("Student.run");
    16. }
    17. }
    1. public class Polymorphic {
    2. public static void main(String[] args) {
    3. // 给一个有普通收入、工资收入和享受国务院特殊津贴的小伙伴算税:
    4. Income[] incomes = new Income[] {
    5. new Income(3000),
    6. new Salary(7500),
    7. new StateCouncilSpecialAllowance(15000)
    8. };
    9. System.out.println(totalTax(incomes));
    10. }
    11. public static double totalTax(Income... incomes) {
    12. double total = 0;
    13. for (Income income: incomes) {
    14. total = total + income.getTax();
    15. }
    16. return total;
    17. }
    18. }
    19. class Income {
    20. protected final double income;
    21. public Income(double income) {
    22. this.income = income;
    23. }
    24. public double getTax() {
    25. return income * 0.1; // 税率10%
    26. }
    27. }
    28. class Salary extends Income {
    29. //重载方法,方法签名不一致,这是一个新方法。
    30. public Salary(double income) {
    31. super(income);
    32. }
    33. @Override
    34. public double getTax() {
    35. if (income <= 5000) {
    36. return 0;
    37. }
    38. return (income - 5000) * 0.2;
    39. }
    40. }
    41. class StateCouncilSpecialAllowance extends Income {
    42. public StateCouncilSpecialAllowance(double income) {
    43. super(income);
    44. }
    45. @Override
    46. public double getTax() {
    47. return 0;
    48. }
    49. }

    观察totalTax()方法:利用多态,totalTax()方法只需要和Income打交道,它完全不需要知道Salary和StateCouncilSpecialAllowance的存在,就可以正确计算出总的税。如果我们要新增一种稿费收入,只需要从Income派生,然后正确覆写getTax()方法就可以。把新的类型传入totalTax(),不需要修改任何代码。
    可见,多态具有一个非常强大的功能,就是允许添加更多类型的子类实现功能扩展,却不需要修改基于父类的代码。