Java面向对象5--多态

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字段。

上一篇:java中final和static关键字


下一篇:接口的定义