2012-04-17 15:26:02Morris

[JAVA][作業][Lab4] Inheritance

課本 503 第6題

Create a class called Vehicle that has the manufacturer’s name (type String), number of cylinders in the engine (type int), and owner (type Person given below). Then, create a class called Truck that is derived from Vehicle and has the following additional properties: the load capacity in tons (type double since it may contain a fractional part) and towing capacity in pounds (type int). Be sure your class has a reasonable complement of constructors, accessor and mutator methods, and suitably defined equals and toString methods. Write a program to test all your methods.

The definition of the class Person is below. Completing the definitions of the methods


package Person;
/**
 * @author Shiang-Yun Yang
 */
public class Person {
    private String name;

    public Person() {
        this("No name");
    }

    public Person(String theName) {
        name = theName;
    }

    public Person(Person theObject) {
        this(theObject.name);
    }

    public String getName() {
        return name;
    }

    public void setName(String theName) {
        name = theName;
    }

    public String toString() {
        return name;
    }

    @Override
    public boolean equals(Object other) {
        if (other == null)
            return false;
        if (!(other instanceof Person))
            return false;
        return this.name.equals(((Person) other).name);
    }
}

package Vehicle;

import Person.*;

/**
 * @author Shiang-Yun Yang
 */
public class Vehicle {
    private String manufacturer;
    private int cylinder;
    private Person owner;

    public Vehicle() {
        this("None", 0, new Person());
    }

    public Vehicle(String manufacturer, int cylinder, Person owner) {
        if(cylinder < 0) {
            System.out.println("Format Error");
            System.exit(0);
        }
        this.manufacturer = manufacturer;
        this.cylinder = cylinder;
        this.owner = new Person(owner);
    }

    /**
     * Copy constructor by Truck Class
     *
     * @param other
     */
    public Vehicle(Vehicle other) {
        this(other.manufacturer, other.cylinder, other.owner);
    }

    public String getManufacturer() {
        return manufacturer;
    }

    public int getCylinder() {
        return cylinder;
    }

    public Person getOwner() {
        return new Person(owner);
    }

    public void setManufacturer(String manufacturer) {
        this.manufacturer = manufacturer;
    }

    public void setCylinder(int cylinder) {
        if(cylinder < 0) {
            System.out.println("Format Error");
            System.exit(0);
        }
        this.cylinder = cylinder;
    }

    public void setOwner(Person owner) {
        this.owner = new Person(owner);
    }

    public String toString() {
        return manufacturer + ", " + cylinder + " cylinders, owned by " + owner;
    }

    /*
     * "Object instanceof Class"
     * if Object == null, return false. but Class
     * can't be null.
     */
    @Override
    public boolean equals(Object other) {
        /*
        if(other == null || other.getClass() != this.getClass())
             return false;
        */
        if (!(other instanceof Vehicle))
            return false;
        return this.manufacturer.equals(((Vehicle) other).manufacturer)
                && this.cylinder == ((Vehicle) other).cylinder
                && this.owner.equals(((Vehicle) other).owner);
    }
}


package Truck;

import Vehicle.*;
import Person.*;

/**
 * @author Shiang-Yun Yang
 */
public class Truck extends Vehicle {
    private double loadCapacity;
    private int towingCapacity;

    public Truck() {
        super();
    }

    public Truck(String manufacturer, int cylinder, Person owner,
            double loadCapacity, int towingCapacity) {
        super(manufacturer, cylinder, owner);
        if(loadCapacity < 0 || towingCapacity < 0) {
            System.out.println("Format Error");
            System.exit(0);
        }
        this.loadCapacity = loadCapacity;
        this.towingCapacity = towingCapacity;
    }

    /**
     * Copy constructor by Truck Class
     *
     * @param other
     */
    public Truck(Truck other) {
        super(other);
        if(loadCapacity < 0 || towingCapacity < 0) {
            System.out.println("Format Error");
            System.exit(0);
        }
        loadCapacity = other.loadCapacity;
        towingCapacity = other.towingCapacity;
    }

    public double getLoadCapacity() {
        return loadCapacity;
    }

    public int getTowingCapacity() {
        return towingCapacity;
    }

    public void setLoadCapacity(double load) {
        if(loadCapacity < 0) {
            System.out.println("Format Error");
            System.exit(0);
        }
        loadCapacity = load;
    }

    public void setTowingCapacity(int towing) {
        if(towingCapacity < 0) {
            System.out.println("Format Error");
            System.exit(0);
        }
        towingCapacity = towing;
    }

    public String toString() {
        return super.toString() + ", load capacity " + loadCapacity
                + " ton(s), towing capacity " + towingCapacity;
    }

    /*
     * "Object instanceof Class"
     * if Object == null, return false. but Class
     * can't be null.
     */
    @Override
    public boolean equals(Object other) {
        /*
        if(other == null || other.getClass() != this.getClass())
             return false;
        */
        if (!(other instanceof Truck))
            return false;
        return super.equals(other)
                && this.loadCapacity == ((Truck) other).loadCapacity
                && this.towingCapacity == ((Truck) other).towingCapacity;
    }
}
/*
 * 1. super() method should be written in first line
 * 2. || and && are special operators, and both strong logic operators.
 * 3. instanceof and Object.getClass() are different.
 */

import Person.*;
import Truck.*;
import Vehicle.*;

/**
 * @author Shiang-Yun Yang
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println("Test Person Class:");

        Person p1 = new Person();
        System.out.println("p1: " + p1);

        p1.setName("Morris");
        System.out.println("p1: " + p1.getName());

        Person p2 = new Person("Ping-Lin");
        System.out.println("p2: " + p2);

        Person p3 = new Person(p1);
        System.out.println("p3.equals(p1): " + p3.equals(p1));
        System.out.println("p3.equals(p2): " + p3.equals(p2));

        System.out.println("\nTest Vehicle Class:");
        Vehicle v1 = new Vehicle();
        System.out.println("v1: " + v1);

        v1.setManufacturer("Porsche");
        v1.setCylinder(4);
        v1.setOwner(new Person("Dijkstra"));
        System.out.println("V1's Manufacturer is " + v1.getManufacturer());
        System.out.println("V1's Cylinders is " + v1.getCylinder());
        System.out.println("V1's Owner is " + v1.getOwner());

        Vehicle v2 = new Vehicle("Porsche", 8, new Person("Ping"));
        System.out.println("v2: " + v2);

        Vehicle v3 = new Vehicle(v1);
        System.out.println("v3.equals(v1): " + v3.equals(v1));
        System.out.println("v3.equals(v2): " + v3.equals(v2));

        System.out.println("\nTest Truck Class:");
        Truck t1 = new Truck();
        System.out.println("t1: " + t1);

        t1.setLoadCapacity(10.20);
        t1.setTowingCapacity(5);
        System.out.println("t1's load capacity is " + t1.getLoadCapacity());
        System.out.println("t1's lowing capacity is " + t1.getTowingCapacity());

        Truck t2 = new Truck("NISSAN", 6, new Person("Ping-Lin"), 10.25, 9);
        System.out.println("t2: " + t2);

        Truck t3 = new Truck(t1);
        System.out.println("t3.equals(t1): " + t3.equals(t1));
        System.out.println("t3.equals(t2): " + t3.equals(t2));
       
        System.out.println("\nTest \"instanceOf\" and \"getClass()\" difference:");
        System.out.println("I use \"instanceOf\" method to write equals(), the answer will be");
        Vehicle v4 = new Vehicle();
        Truck t4 = new Truck();
        System.out.println("t4.equals(v4): "+ t4.equals(v1));
        System.out.println("v4.equals(t4): "+ v4.equals(t4));
        System.out.println("If \"getClass()\" method to write equals(), the answer will be");
        System.out.println("t4.equals(v4): false");
        System.out.println("v4.equals(t4): false");
    }
}