【问题标题】:Homework: explaining inheritance + override in Java作业:解释Java中的继承+覆盖
【发布时间】:2017-01-14 20:26:50
【问题描述】:

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

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 的新手 :) 我自己注释掉每一行,直到我得到更多练习,但直到现在似乎一步一步的 cmets成为我把握事物的最佳方式。

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关键字)用这个例子解释继承?

【问题讨论】:

  • 请尽量限制每个...问题 1 个问题。
  • 对不起,我知道它看起来很强大.. :)
  • 我建议您使用您在此处找到的许多答案尝试您的源代码,或者使用谷歌搜索并自己输入一些内容。在键入时尝试继承的概念和限制:例如,尝试使用派生类的基类的私有方法。它不会编译。所以尝试所有这些,你会得到一张好照片。如果需要,甚至可以更改基类。

标签: java inheritance subclass


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 非常感谢,Justisr!这让我明白了很多:) 所以这里实际上没有压倒一切的存在吗?
  • 我已经编辑了我的答案以纠正我在 #3 上犯的错误,您正在覆盖 printItem 方法。我很抱歉之前没有看到这个。虽然我很高兴我的其余回复对你有用。 ^-^
【解决方案2】:

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

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

您可以说printItem() 方法是通过Ipad 类实现执行的,因为IpadItem 继承并覆盖了它。

所以,printItem() 将打印 "serial, iPad, 123"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    相关资源
    最近更新 更多