继承
在Java中,术语继承是指通过另一个类(子类)采用一个类(超类)的所有非私有属性和方法。继承是一种将现有类的副本作为另一个类的起点的方法。除了术语子类之外,继承的类也称为derived
类。
此时,区分继承和接口可能会有所帮助。接口仅定义类成员的结构,而继承的类包括超类的实际代码。此外,继承(更准确地说,子类的定义)使用extends
子类声明中的关键字。
为清楚起见,如果使用超类创建子类并且子类保持不变,则这两个类将是相同的。但是大多数子类并没有保持不变。因为子类仍然是一个类,所以可以将其更改为包含新属性和方法。完成的子类甚至可以用作超类来创建其他子类。继承级别的数量没有有效限制。
子类的方法和属性可以像它的超类一样使用。他们也可以被覆盖。覆盖是用新代码替换(或扩充)原始代码以适应当前目的的过程。子类中重写方法的签名仍然与超类相同,但方法的内容将更改为以新形式满足方法的目标。这甚至可能意味着在同一方法中执行某些新代码之前或之后执行从超类继承的代码。要从子类中执行继承的代码,请在方法前加上super`关键字(例如,super.methodName())。super'.It is also possible to write a subclass constructor that invokes the constructor of the superclass, either implicitly or by using the
为什么这样?继承促进了代码重用以及泛型到特定实现的概念。理想情况下,超类将以最通用的级别编写。然后可以从超类创建子类,具有更精细,更具体的目的。
继承的一个例子
想想一扇门。什么样的都没关系。所有门都打开和关闭。然而,有些门打开的方式与其他门不同(提升与摆动相比,摆动与滑动相比)。所以,让我们说门是门的超类,它有一个open
方法。方法很简单。这是唯一的指示push
。
public class Door { public void open () { push(); // Since this is just a generic "Door" we will assume the simplest opening method. // The actual open method must be overridden by a subclass, as we see below. // Later, a way to force a subclass to override a method will be demonstrated -- // but for this simple example will do for now. }}
在银行金库门上使用此类可能会失败。一个更好的策略是使用继承“子类化”Door,然后覆盖open
方法以输入组合pull
而不是push
。
class BankVaultDoor extends Door { // The "extends" keyword used to tell java that BankVaultDoor inherits the functionality of Door. public void open () { enterCombination(); pull; }}
使用继承的优点是编写适用于扩展更通用类的许多类的代码。在下面的例子中,我们有一个方法可以打开几种类型的门。
public class Main { public static void main(String[] args) { Door d1 = new BankVaultDoor(); Door d2 = new HouseFrontDoor(); Door d3 = new CarDoor(); } if (arg[0] == "car") { d3.open(); } else if (arg[0] == "bank") { d1.open(); } else { d2.open(); }}
请注意,该方法不知道(或关心)门的类型。从Door(using )子类化的任何类都将使用该方法打开它。open()
extends Door
open()