当前位置:网站首页 > Java教程 > 正文

java 动态教程



廖雪峰
资深软件开发工程师,业余马拉松选手。

在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为覆写(Override)。

例如,在类中,我们定义了方法:

在子类中,覆写这个方法:

Override和Overload不同的是,如果方法签名不同,就是Overload,Overload方法是一个新方法;如果方法签名相同,并且返回值也相同,就是。

加上可以让编译器帮助检查是否进行了正确的覆写。希望进行覆写,但是不小心写错了方法签名,编译器会报错。

但是不是必需的。

在上一节中,我们已经知道,引用变量的声明类型可能与其实际类型不符,例如:

现在,我们考虑一种情况,如果子类覆写了父类的方法:

那么,一个实际类型为,引用类型为的变量,调用其方法,调用的是还是的方法?

运行一下上面的代码就可以知道,实际上调用的方法是的方法。因此可得出结论:

Java的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型。

这个非常重要的特性在面向对象编程中称之为多态。它的英文拼写非常复杂:Polymorphic。

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

有同学会说,从上面的代码一看就明白,肯定调用的是的方法啊。

但是,假设我们编写这样一个方法:

它传入的参数类型是,我们是无法知道传入的参数实际类型究竟是,还是,还是的其他子类例如,因此,也无法确定调用的是不是类定义的方法。

所以,多态的特性就是,运行期才能动态决定调用的子类方法。对某个类型调用某个方法,执行的实际方法可能是某个子类的覆写方法。这种不确定性的方法调用,究竟有什么作用?

我们还是来举例子。

假设我们定义一种收入,需要给它报税,那么先定义一个类:

对于工资收入,可以减去一个基数,那么我们可以从派生出,并覆写:

如果你享受国务院特殊津贴,那么按照规定,可以全部免税:

现在,我们要编写一个报税的财务软件,对于一个人的所有收入进行报税,可以这么写:

来试一下:

观察方法:利用多态,方法只需要和打交道,它完全不需要知道和的存在,就可以正确计算出总的税。如果我们要新增一种稿费收入,只需要从派生,然后正确覆写方法就可以。把新的类型传入,不需要修改任何代码。

可见,多态具有一个非常强大的功能,就是允许添加更多类型的子类实现功能扩展,却不需要修改基于父类的代码。

因为所有的最终都继承自,而定义了几个重要的方法:

  • :把instance输出为;
  • :判断两个instance是否逻辑相等;
  • :计算一个instance的哈希值。

在必要的情况下,我们可以覆写的这几个方法。例如:

在子类的覆写方法中,如果要调用父类的被覆写的方法,可以通过来调用。例如:

继承可以允许子类覆写父类的方法。如果一个父类不允许子类对它的某个方法进行覆写,可以把该方法标记为。用修饰的方法不能被:

如果一个类不希望任何其他类继承自它,那么可以把这个类本身标记为。用修饰的类不能被继承:

对于一个类的实例字段,同样可以用修饰。用修饰的字段在初始化后不能被修改。例如:

对字段重新赋值会报错:

可以在构造方法中初始化final字段:

这种方法更为常用,因为可以保证实例一旦创建,其字段就不可修改。

给一个有工资收入和稿费收入的小伙伴算税。

下载练习

子类可以覆写父类的方法(Override),覆写在子类中改变了父类方法的行为;

Java的方法调用总是作用于运行期对象的实际类型,这种行为称为多态;

修饰符有多种作用:

  • 修饰的方法可以阻止被覆写;
  • 修饰的class可以阻止被继承;
  • 修饰的field必须在创建对象时初始化,随后不可修改。

版权声明


相关文章:

  • java数组 菜鸟教程2025-03-24 21:02:05
  • java自学教程语句2025-03-24 21:02:05
  • java开发实践教程2025-03-24 21:02:05
  • it教程java2025-03-24 21:02:05
  • 孙鑫的java教程2025-03-24 21:02:05
  • java流程笔记教程2025-03-24 21:02:05
  • java辅助开发教程2025-03-24 21:02:05
  • Java容器菜鸟教程2025-03-24 21:02:05
  • java编程教程420集免费2025-03-24 21:02:05
  • java模块使用教程2025-03-24 21:02:05