Java - 了解继承

时间:2014-01-30 00:55:56

标签: java object inheritance

我是Java的新手,已经开始了几个星期的课程,并被要求完成一个包含以下信息的程序:

  
      
  1. 设计具有以下数据字段的船舶类:

         
        
    • 船舶名称的数据字段(字符串)。

    •   
    • 船舶建造年份的数据字段(int)。

    •   
    • 构造函数和适当的访问器和更改器。

    •   
    • 显示船名及其年份的toString方法。

    •   
  2.   
  3. 设计一个扩展Ship类的CruiseShip子类。 CruiseShip类应具有以下内容:

         
        
    • 最大乘客数量的额外数据字段(int)。

    •   
    • 构造函数和适当的访问器和更改器。

    •   
    • 一个toString方法,它覆盖基类中的toString方法。 CruiseShip类的toString方法也应该包括   最大乘客限制。

    •   
  4.   
  5. 设计扩展Ship类的CargoShip类。 CargoShip类应具有以下内容:

         
        
    • 吨位货物容量的额外数据字段(int)。

    •   
    • 构造函数和适当的访问器和更改器。

    •   
    • 一个toString方法,它覆盖基类中的toString方法。 CargoShip类的toString方法也应该包括   货物吨位。

    •   
  6.   
  7. 在适当的班级中包括一个等于测试两艘船是否相等的方法 - 如果它们具有   同名,并于同年建成。

  8.   
  9. 演示程序(ShipTester)中具有Ship对象数组(至少5个)的类。分配各种船舶,CruiseShip,   和CargoShip对象到数组元素(你可以硬编码   对象和数据)并打印出初始船舶配置。节目   您可以在采样中使用访问器和增变器方法   船舶(再次,你可以在这里硬编码方法参数,如果   你喜欢)。

  10.   

我理解问题所依据的基础,并且我做了以下事情:

Ship.java

public class Ship {

    private String name;
    private int yearBuilt;

    public Ship(String name, int yearBuilt) {

        this.name = name;
        this.yearBuilt = yearBuilt;

    }

    public String returnName() {

        return this.name;

    }

    public int returnYear() {

        return this.yearBuilt;

    }

    public boolean equals(Ship other) {

        return false;

    }

    public String toString() {

        return "[Name: " + this.name + ". Year built: " + this.yearBuilt + "]";

    }
}

CruiseShip.java

public class CruiseShip extends Ship {

    private int maxPassengers;

    public CruiseShip() {

        super("USS Enterprise", 2245);

        this.maxPassengers = 2400;

    }

    public CruiseShip(String name, int yearBuilt, int maxPassengers) {

        super(name, yearBuilt);
        this.maxPassengers = maxPassengers;

    }

    public String toString() {

        return "Cruise Ship" + super.toString() + ", Passengers: " + this.maxPassengers + "]";

    }

}

CargoShip.java

public class CargoShip extends Ship {

    private int cargoCapacity;

    public CargoShip() {

        super("Black Pearl", 1699);

        this.cargoCapacity = 50000;

    }

    public CargoShip(String name, int yearBuilt, int cargoCapacity) {

        super(name, yearBuilt);
        this.cargoCapacity = cargoCapacity;

    }

    public String toString() {

        return "Cargo Ship" + super.toString() + ", Tonnage: " + this.cargoCapacity + "]";

    }

}

并在我的测试人员文件中 - ShipTester.java

public class ShipTester {
    public static void main(String []args) {

        //I don't know what to put over here...

    }
}

我不知道主要方法应该放什么...我知道我必须创建一系列船只,但我不知道如何用货船,游轮等来做到这一点。 ..

我应该拥有的输出:

显示船舶: 船[名称:Queen Annes Revenge建造年份:1701]

游轮[船舶[名称:USS企业建成年份:2245],乘客:2400]

货船[船舶[名称:黑珍珠建成年份:1699],吨位:50000]

游轮[船舶名称:USS Voyager建造年份:2371],乘客:2800]

货船[船舶[名称:建造的胜利年份:1790],吨位:33100]

2 个答案:

答案 0 :(得分:2)

扩展到Hovercraft所说的内容,但您可能希望将ArrayList用于对象数组。

Creating an Arraylist of Objects

实施例

ArrayList<Ship> myArray = new ArrayList();
myArray.add(new CargoShip("TheKing",1990,10000));
myArray.add(new CruiseShip("Princess",2000,5000));

[编辑]忘了你也需要打印它

使用简单的for循环进行打印,例如:

for (int i = 0; i < myArray.size(); i++) {
  System.out.println(myArray.get(i).toString());
}

注意 - 这不是我不想跳过你的学习过程的确切答案。但这至少应该让你知道你可以走的道路......

答案 1 :(得分:0)

Ship是“基础”父类,它将所有其他类放入一个共同的族中。这意味着CruiseShipCargoShip实际上可以伪装成Ship。这是Polymorphism的基石,也是使面向对象程序如此强大的功能之一。

根据您的示例代码,您只需创建一个类型为Ship的数组,例如......

Ship[] ships = new Ship[5];

然后你只需要用各种各样的船来填充这个数组......

ships[0] = new CargoShip("Lolli Pop", 1965, 1990);
ships[1] = new CruiseShip("Love Boat", 1980, 8);

这意味着,每个元素“充当”Ship,因为CargoShipCruiseShip继承自Ship,这使他们有能力这样做,因为他们是“船只”

由于Ship的显示信息是由toString方法定义的,因此您只需使用System.out.println(instanceOfShip)进行打印即可。例如......

for (Ship ship : ships) {
    System.out.println(ship);
}

详细了解InheritanceArrays了解详情

它可能看起来令人困惑和令人生畏,但一旦你理解了继承的基础知识,它将变得非常明显和非常强大