Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Unexpected output while dealing with hierarchies in Java

i was working on a school worksheet when i stumbled on this problem. I have the vehicle class as such:

public class Vehicle {
private static int idcouter = 0;

private int id;
private Condition condition;
private int price;

public Vehicle() {
    this.id = idcouter++;
    this.condition = condition;
    this.price = price;
}

public Condition getCondition() {
    return condition;
}

public void setCondition(Condition condition) {
    this.condition = condition;
}

public int getPrice() {
    return price;
}

public void setPrice(int price) {
    this.price = price;
}}

And Truck as such:

public class Truck extends Vehicle {
private boolean trailer;

public Truck() {
    super();
    this.trailer = trailer;
}

@Override
public void setPrice(int price) {
    if (this.getCondition() == enums.Enums.Condition.NEW) {
        if (this.trailer) {
            int tempPrice = (int) (price * 0.95f);
            super.setPrice(tempPrice);
        } else {
            super.setPrice(price);
        }
    } else {
        int tempPrice = (int) (price * 0.85f);
        super.setPrice(tempPrice);
    }
}}

Given my main:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

    Truck t1 = new Truck();
    Truck t2 = new Truck();
    Truck t3 = new Truck();
    t1.setPrice(200);
    t2.setPrice(200);
    t3.setPrice(200);
    
    t1.setCondition(enums.Enums.Condition.NEW);
    t1.setTrailer(true);
    
    t2.setCondition(enums.Enums.Condition.NEW);
    t2.setTrailer(false);
    
    t3.setCondition(enums.Enums.Condition.USED);
    t3.setTrailer(true);
    
    System.out.println("Price: " + t1.getPrice());
    System.out.println("Price: " + t2.getPrice());
    System.out.println("Price: " + t3.getPrice());

Why is my output:

Price: 170

For all the trucks 1,2 and 3.

It makes no sense, it should be overriding it. I did something similar with Car, a sub class of vehicle and it worked perfectly. I´ve tried different things but i can’t understand what’s happening. If anyone could share some information or point me in the right direction I would appreciate it. Thanks in advance.

>Solution :

It’s because the value of the member variable trailer is false for all instance of Truck (t1,t2, t3). The method setPrice is called before the setTrailer is called.

The logic of setPrice will always see trailer as false which is the default value for a native boolean. If trailer would be of type Boolean the setPrice method would throw a NullPointerExcpetion for all calls of setPrice(200).

The assignments in the constructors of Truck and Vehicle are useless because the constructors have no arguments which could be assigned to this.xxxxx variables.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading