家庭作业:在 Java 中解释继承 + 覆盖

Homework: explaining inheritance + override in Java

我被要求根据以下代码解释继承+覆盖的概念。

public class Item {

private String itemType;
private String serialNumber;

public Item(String serialNumber, String itemType) {
    this.setItemType(itemType);
    this.setSerialNumber(serialNumber);     
}

public String getItemType() {
    return itemType;
}

public void setItemType(String itemType) {
    this.itemType = itemType;
}

public String getSerialNumber() {
    return serialNumber;
}

public void setSerialNumber(String serialNumber) {
    this.serialNumber = serialNumber;
}

public String printItem() {
    return serialNumber + "," + itemType;
}
}



public class Ipad extends Item {

private int ram;

public Ipad(String serialNumber, int ram) {
    super(serialNumber,"iPad");
    this.setRam(ram);
}

public int getRam() {
    return ram;
}

public void setRam(int ram) {
    this.ram = ram;
}

public String printItem() {
    return super.getSerialNumber() + "," + super.getItemType()+ "," + getRam() + " GB";
}   
}

我很难真正解释发生了什么,因为我在学习方面还很陌生 Java :) 我会自己注释掉每一行,直到我得到更多的练习,但直到现在这一步-循序渐进的评论似乎是我掌握事物的最佳方式。

1) 下面的代码片段发生了什么:我假设它是一个构造函数,但是下面的两行是做什么的?

public Item(String serialNumber, String itemType) {
    this.setItemType(itemType);
    this.setSerialNumber(serialNumber); 

2) 下面发生了什么——有两个构造函数吗? 据我了解,构造函数不能被覆盖。 我假设 super 正在从超类调用构造函数,但随后添加了一个新的 ram 变量。如果不被覆盖,这就是所谓的构造函数链接吗?

public Ipad(String serialNumber, int ram) {
    super(serialNumber,"iPad");
    this.setRam(ram);
}

3) 什么被覆盖了?

4) 我如何(除了使用 extends 关键字 + super 关键字)用这个例子解释继承?

你可以用这个例子来解释它:

Item item = new Ipad("serial", 123);
System.out.println(item.printItem());

你可以说方法 printItem() 是用 Ipad class 实现执行的,因为 IpadItem 继承并覆盖了它。

因此,printItem() 将打印 "serial, iPad, 123"

1) 您提供的代码片段正在创建一个带有序列号和项目类型参数的项目对象;正如您在 Item class' 构造函数中看到的那样,它只是将序列号和项目类型设置为提供的参数。 构造函数通常具有对象功能所需的参数,这就是它们存在的原因。确保对象完全'constructed'.

public Item(String serialNumber, String itemType) {
this.setItemType(itemType);
this.setSerialNumber(serialNumber); 

2) 构造函数链接是指当一个对象引用另一个构造函数时,允许通过向对象提供不同的参数来重用构造功能以进行构造。 在您给出的示例中, IPad 对象只是继承了 Item 构造函数。作为 subclass,IPad 需要在它自己的构造中引用 Item 的构造函数。这必须在第一行完成。 通过这种方式,您确实无法覆盖构造函数,但是,您确实可以通过设置 ram IPad 构造函数参数中提供的内容。

public Ipad(String serialNumber, int ram) {
super(serialNumber,"iPad");
this.setRam(ram);

3) 除了 #printItem 之外,您在此示例中没有覆盖任何内容,它将项目的 ram 添加到项目的打印字符串表示中。除此之外,您只是通过 Ipad class.

继承并添加到项目 class

4) 你可以用简单的英语解释这个。 IPad 是一个项目,具有作为一个项目的所有功能和数据,并添加了它自己的 IPad 特定功能和数据。

您也可以将此与另一种情况进行比较。比如长方形和正方形。正方形是长方形,然而,长方形不一定是正方形,尽管它可能是。 IPad 是一个项目,但是,项目不一定是 IPad,尽管它可能是。 它是一个规范,是其更通用的父级的一个分支。