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

时间:2017-01-14 20:26:50

标签: 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正在从超类调用构造函数,但随后添加了一个新的ram变量。这就是所谓的构造函数链接,如果它没有被覆盖?

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

3)什么被覆盖?

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

您还可以将此与其他情况进行比较。例如用矩形和正方形。正方形是一个矩形,但是,矩形不一定是正方形,尽管它可以是。 IPad是一个项目,但是,项目不一定是IPad,尽管它可能是。 它是一个规范,是其更一般的父母的一个分支。

答案 1 :(得分:0)

您可以使用此示例解释它:

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

您可以说方法printItem()是使用Ipad类实现执行的,因为Ipad会从Item继承它并覆盖它。

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