Java 101: Java多态及其类型

本文翻译自javaworld,原文链接https://www.javaworld.com/article/3033445/java-101-polymorphism-in-java.html。

多态性是指某些实体以不同的形式出现的能力。它通常可以通过蝴蝶来说明,从幼虫到蛹再到成虫。多态也出现在编程语言中,作为一种建模技术,允许你为各种操作数、参数和对象创建单个接口。Java多态让代码更加的简洁,并且更容易维护。

虽然本教程侧重与多态性的子类型,但是多态的几种类型你也应该知道。首先我们将概述多态的四种类型。

Java中的多态类型

在Java中有四种多态类型。

强制类型转换操作支持多个类型隐式的转换。比如,你用一个整数乘另一个整数,或者一个浮点数乘另一个浮点数。如果一个操作数是整数但是另一个操作数是浮点数,编译器为了防止类型错误就会将整数隐式的转换成浮点数(没有乘法操作支持一个整数和浮点数相乘)。另一个例子是将一个方法中的父类参数指向一个子类的引用。编译器会强制将子类型转换成父类型。

重载是指在不同的上下文中使用相同的操作符或者方法名。例如,你可以使用 + 去执行整数加法,浮点数加法,或者字符串连接,这依赖于操作数的类型。同样,一个类中可以出现多个具有相同名字的方法(通过声明或者继承)。

参数多态性规定在类的生命中,一个字段名可以关联不同的类型,一个方法名可以关联不同的参数和返回值类型。这个字段和方法之后可以接受一个类实例(对象)的不同类型。例如,在一个对象中一个字段可能是Double类型(Java标准类库的成员,double的包装类型)同时一个方法也可能返回一个Double类型,同时一个相同的字段可能是String类型、相同的方法可能返回一个String类型在另一个对象中。Java通过泛型来支持参数的多态性,我们在之后的文章中会讨论到这些。

子类型是指该类型可以作为一个类型的子类型。当一个子类型实例出现在父类型的的上下文中时,在实例上执行一个父类型的操作最终执行的会是子类型的版本。比如,考虑一段可以绘制任意类型的图形的代码。你可以通过一个图形类和一个draw方法更清楚的表达这段代码;通过圆形、长方形或者其他的子类来重写draw方法。通过一个元素指向图形子类实例的图形类型数组;然后让每个实例调用图形类的draw方法。当你调用draw方法,然后将会是圆形的,长方形的或者其他图形实例的draw方法将会被调用。我们说这就是图形draw方法的多种形式。

这里重点介绍了子类型多态性。你将学习到向上转型和延迟绑定,抽象类(无法实例化),抽象方法(无法被调用)。你还将学习到向下转型和运行时类型确定,并且你将第一次看到可变返回类型。我将在后面的文章中重点介绍参数的多态性。

特定和通用多态性
像许多开发者一样,我将强制类型转换和重载作为特定多态性,将参数和子类型作为通用多态性。作为有价值的技术,我不认为强制类型转换和重载是真的多态;他们更像是类型转换和语法糖。

 

你可能感兴趣的:(技术文章翻译系列,每周一篇技术翻译系列)