java - 作业: explaining inheritance + override in Java

标签 java inheritance subclass

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

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 正在调用父类(super class)的构造函数,但随后添加了一个新的 ram 变量。那么,如果没有被重写,这就是所谓的构造函数链接吗?

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

3)什么被覆盖了?

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

最佳答案

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

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

2) 构造函数链接是指一个对象引用其另一个构造函数,从而允许使用已提供给对象进行构造的不同参数来重用构造功能。 在您给出的示例中,iPad 对象只是继承了 Item 构造函数。作为子类,iPad 需要在其自己的构造中引用 Item 的构造函数。这必须在第一行完成。 这样,您确实无法重写构造函数,但是,您可以通过将 ram 设置为 iPad 构造函数参数中提供的 RAM,向 Item 类中不存在的 IPad 类的构造添加其他功能。

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

3) 在此示例中,除了 #printItem 之外,您没有覆盖任何内容,它将项目的 ram 添加到项目的打印字符串表示形式中。除此之外,您只需通过 Ipad 类继承并添加到 Item 类即可。

4) 你可以用简单的英语来解释这一点。 iPad 是一个项目,拥有作为一个项目的所有功能和数据,此外还添加了它自己的 iPad 特定功能和数据。

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

关于java - 作业: explaining inheritance + override in Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41654638/

相关文章:

java - hibernate 错误

java - 当我更改显示时间时 SimpleDateFormat 崩溃

java - 当我从 Object 类覆盖 equals() 时如何实现 hashCode()

swift - 类扩展了 SKScene 但无法访问其属性

c# - 有没有办法让派生类覆盖 ToString()?

java - 序列化 Path2D.Double 的子类时为 "no valid constructor"

java - 如何使用 SimpleDateFormat.parse() 将 Calendar.toString() 转换为日期?

javascript - 如何扩展谷歌地图类?

c++ - (C++) 如何指向子类中的方法?

java - 从父类(super class)中获取子类的名称