2015-04-16 3 views
-2

Я начинаю изучать JAVA. Меня попросили создать Автомобильную программу, которая отслеживает новые и подержанные автомобили. Я должен создать суперкласс под названием car, два производных класса под названием UsedCar и NewCar и класс Driver, который тестирует эти 3 класса.Метод отображения - ошибка вывода

Все классы компилируются и запускаются. Однако. Когда я его выводю, я получаю вывод мусора. Я не понимаю, где я ошибся. Я знаю, что класс драйвера прекрасен, а также класс супер-автомобилей. Где-то в классах UsedCar и NewCar это приводит к ошибкам вывода. Любые советы или предложения будут полезны.

Вот мой класс драйвера:

public class CarDriver 
{ 

public static void main(String[] args) 
{ 
    NewCar new1 = new NewCar(8000.33, "silver"); 
    NewCar new2 = new NewCar(8000.33, "silver"); 
    if (new1.equals(new2)) 
    { 
    new1.display(); 
    } 

    UsedCar used1 = new UsedCar(2500, 100000); 
    UsedCar used2 = new UsedCar(2500, 100000); 
    if (used1.equals(used2)) 
    { 
    used1.display(); 
    } 
} // end main 
}//end class 

Вот мой автомобиль Класс:

import java.util.*; 


public class Car 
{ 

//Variables 

public Double price; 


//Constructor 

public Car(Double cost)//constructor to create instances of SavingsAccount 
      { 
       price = cost *2; 
      } 

//GetPrice method 

public Double getPrice()//method to get the cars' price 
      { 
      return price;//returns the value of the price 

     } 


    }//end class Car 

Вот производные классы: NewCar

import java.util.*; 

public class NewCar extends Car 
{ 

    //Variables 
    public String color = "silver"; 

NewCar new1 = new NewCar(8000.33, "silver"); 
    NewCar new2 = new NewCar(8000.33, "silver"); 

    //Constructor - Two Parameter 

    public NewCar (Double price, String color)//constructor to create instances of new car 
       { 
        super(price); 
        color = this.color; 

      } 


    //Equals Method 

    public boolean equals(Car NewCar) 
    { 
     if (NewCar == null) 
     { 
     return false; 
     } 
     else 
     { 
     return 
      price.equals(new1.price) && 
      color.equals(new2.color); 
     } 
} // end equals 

//Display method 

public void display() 
{ 
    System.out.println(" " + new1.price + new1.color); 
}//end display method 

}//end class NewCar 

UsedCar

import java.util.*; 

public class UsedCar extends Car 
{ 

//Variables 

private double mileage; 
public String color = "silver"; 

UsedCar used1 = new UsedCar(2500, 100000); 
UsedCar used2 = new UsedCar(2500, 100000); 

//Constructor -Two Parameter 

public UsedCar (double price, double mileage)//constructor to create instances of new car 
       { 
        super(price); 
        mileage = this.mileage; 

      } 

    //Equals Method 

public boolean equals(Car UsedCar) 
    { 
     if (UsedCar == null) 
     { 
     return false; 
     } 
     else 
     { 
     return 
      price.equals(used1.price) && 
      color.equals(used2.color); 
     } 
} // end equals 

//Display method 

public void display() 
{ 
    System.out.println(" " + used1.price + used1.mileage); 
}//end display 

}//end class 

Я не могу вставить свой вывод, но он выглядит так в командной строке, и он продолжается без остановок:

«на NewCar. (NewCar. Java: 11)»

ответ

1

В классе NewCar и UsedCar вы создаете один рекурсивный класс.

Возможны ошибки.

Снимите:

NewCar new1 = new NewCar(8000.33, "silver"); 
NewCar new2 = new NewCar(8000.33, "silver") 

и

UsedCar used1 = new UsedCar(2500, 100000); 
UsedCar used2 = new UsedCar(2500, 100000); 

В вашем costructor вы использовали

color = this.color; 

, когда на самом деле вы должны использоваться

this.color = color. 

В методе, который вы внедрили, так исправить.

Это правильно:

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (!super.equals(obj)) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    NewCar other = (NewCar) obj; 
    if (color == null) { 
     if (other.color != null) 
      return false; 
    } else if (!color.equals(other.color)) 
     return false; 
    return true; 
} 

Правильный Класс

автомобилей.Java

public class Car { 

    private Double price; 
    private String color; 

    public Car(String color, Double cost) { 
     this.color = color; 
     this.price = cost * 2; 
    } 

    public Double getPrice() { 
     return price; 
    } 

    public String getColor() { 
     return color; 
    } 

    public void setColor(String color) { 
     this.color = color; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((color == null) ? 0 : color.hashCode()); 
     result = prime * result + ((price == null) ? 0 : price.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Car other = (Car) obj; 
     if (color == null) { 
      if (other.color != null) 
       return false; 
     } else if (!color.equals(other.color)) 
      return false; 
     if (price == null) { 
      if (other.price != null) 
       return false; 
     } else if (!price.equals(other.price)) 
      return false; 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "Car: \nColor:" + color + "\nPrice: " + price; 
    } 

    public void display() { 
     System.out.println(toString()); 
    } 

} 

NewCar.java

public class NewCar extends Car { 

    private String color = "silver"; 

    public NewCar(String color, Double coast) { 
     super(color, coast); 
     this.color = color; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = super.hashCode(); 
     result = prime * result + ((color == null) ? 0 : color.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (!super.equals(obj)) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     NewCar other = (NewCar) obj; 
     if (color == null) { 
      if (other.color != null) 
       return false; 
     } else if (!color.equals(other.color)) 
      return false; 
     return true; 
    } 

    @Override 
    public String toString() { 
     return super.toString() + "\nType: New\nMileage:0\n"; 
    } 
} 

UsedCar.java

public class UsedCar extends Car { 

    private double mileage; 
    private String color = "silver"; 

    public UsedCar(String color, double price, double mileage) { 
     super(color, price); 
     this.mileage = mileage; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = super.hashCode(); 
     result = prime * result + ((color == null) ? 0 : color.hashCode()); 
     long temp; 
     temp = Double.doubleToLongBits(mileage); 
     result = prime * result + (int) (temp^(temp >>> 32)); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (!super.equals(obj)) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     UsedCar other = (UsedCar) obj; 
     if (color == null) { 
      if (other.color != null) 
       return false; 
     } else if (!color.equals(other.color)) 
      return false; 
     if (Double.doubleToLongBits(mileage) != Double.doubleToLongBits(other.mileage)) 
      return false; 
     return true; 
    } 

    @Override 
    public String toString() { 
     return super.toString() + "\nType: Used\nMileage: " + mileage + "\n"; 
    } 

} 

CarDriver.java

public class CarDriver { 

    public static void main(String[] args) { 
     Car new1 = new NewCar("silver", 8000.33); 
     Car new2 = new NewCar("silver", 8000.33); 
     if (new1.equals(new2)) { 
      new1.display(); 
     } 

     Car used1 = new UsedCar("silver", 2500, 100000); 
     Car used2 = new UsedCar("silver", 2500, 100000); 
     if (used1.equals(used2)) { 
      used1.display(); 
     } 
    } 
} 
+0

О, ничего себе. Я понимаю, что я сделал не так, создавая новые объекты в каждом классе. Мне обязательно нужно вернуться и изучить эту главу больше! Кроме того, эти понятия, объясненные здесь, лучше, чем в книге. Теперь имеет смысл переопределить метод equals. – Fryguy

0

Вы можете создать 2 дополнительных NewCar с для каждого NewCar экземпляра создается

public class NewCar extends Car 
{ 
// [...] 

NewCar new1 = new NewCar(8000.33, "silver"); 
NewCar new2 = new NewCar(8000.33, "silver"); 

Эти автомобили пытаются создать еще 2 NewCar с, что будет пытаться создать 2 дополнительных NewCar с, и так далее . Это будет работать только до тех пор, пока достигнет определенного уровня (вы получаете StackOverflow). вы должны удалить инициализацию из 2-х полей new1 и new2, если вы хотите, чтобы избежать исключения.

вы также похожи проблема в UsedCar.

Кроме того, если вы хотите переопределить метод equals, подпись должна быть public boolean equals(Object UsedCar) и не public boolean equals(Car UsedCar).

Типпы: Добавьте @Override аннотацию к каждому методу, который должен переопределить метод суперкласса/интерфейс и компилятор скажет вам, если вы получили подпись неправильно.


Кроме того, вы можете изменить тип price от Double к double. Вы должны использовать только Double вместо double, если знаете, что вам это нужно. Autoboxing и Unboxing могут снизить вашу производительность. См. Autoboxing and Unboxing

0

Я вижу пару проблем с летучей мыши с NewCar.

Во-первых, вы инстанцировании (создание) двух NewCars с кодом

NewCar new1 = new NewCar(8000.33, "silver"); 
NewCar new2 = new NewCar(8000.33, "silver"); 

Это правильно, чтобы создать их в основной программе, так как у вас есть. Вероятно, неверно создавать два новых локальных экземпляра внутри самого класса.

Во-вторых, ваше равно утверждение говорит equals(Car NewCar). Я думаю, что вы хотите equals(Car otherCar). (Пожалуйста, обратите внимание на нижний регистр для переменной экземпляра в качестве конвенции Java.)

Затем в ответ вы бы сказать что-то вроде

return (otherCar.getPrice() == this.getPrice()) && (otherCar.color.equalsIgnoreCase(this.color); 
0

Попробуйте удалить эти строки

NewCar new1 = new NewCar(8000.33, "silver"); 
NewCar new2 = new NewCar(8000.33, "silver"); 

из NewCar класса и эти линии

UsedCar used1 = new UsedCar(2500, 100000); 
UsedCar used2 = new UsedCar(2500, 100000); 

с UsedCar класс. Вы создаете экземпляры этих классов внутри самих классов, и я не думаю, что это то, что вы хотите делать.

Неправильная установка equals(). Например, в NewCar у вас есть

public boolean equals(Car NewCar) 

Обратите внимание, как имя у вас есть для вашей переменной на самом деле имя вашего класса. Вы хотите, вместо этого,

public boolean equals(Object obj) 

Кроме того, вы должны проверить, что объект передается является экземпляром соответствующего подкласса Car, прежде чем сравнивать переменные. То же самое верно для equals() в классе UsedCar.

+0

@fabian Спасибо за редактирование мой ответ, чтобы улучшить форматирование. – wltrup

Смежные вопросы