在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为Override。重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变,即外壳不变,核心重写。重写的好处在于子类可以根据需要,定义特定于自己的行为。
Override和Overload不同的是,如果方法签名不同,就是Overload,Overload方法是一个新方法;如果方法签名相同,并且返回值也相同,就是Override。方法名相同,方法参数相同,但方法返回值不同,也是不同的方法。
在编译过程中,加上@Override可以让编译器帮助检查是否进行了正确的覆写。
class Animal{
public void move() {
System.out.println("动物可以跑");
}
}
class Dog extends Animal{
public void move() {
System.out.println("狗可以跑");
}
}
public class Test01{
public static void main(String args[]) {
Animal a=new Animal();
Animal b=new Dog();
a.move();
b.move();
}
}
super关键字:当需要在子类中调用父类的被重写方法时,要使用 super 关键字
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
super.move(); // 应用super类的方法
System.out.println("狗可以跑和走");
}
}
public class Test01{
public static void main(String args[]){
Animal b = new Dog(); // Dog 对象
b.move(); //执行 Dog类的方法
}
}
多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法,其特性就是运行期才能动态决定调用的子类方法。
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 Other extends Income{ //其他不需交税的类
public Other(double income) {
super(income);
}
@Override
public double getTax() {
return 0;
}
}
public class Main{
public static void main(String[] args) {
Income[] incomes=new Income[] {
//有普通收入,工资收入,其他收入的人算税
new Income(3000),
new Salary(7500),
new Other(15000)
};
System.out.println(totalTax(incomes));
}
public static double totalTax(Income...incomes) {
double total=0;
for (Income income:incomes) {
total=total+income.getTax();
}
return total;
}
}