Почему метод repair не работает?
Ожидается, что метод repair изменит параметр isReadyToDrive экземпляра yamaha на true, но это не выполняется.
package ua.com.foxminded.carmanager;
public class CarManager {
public static void main (String[] args) {
Motorcycle suzuki = new Motorcycle(
"Suzuki GSX-R1000", 2021, 16000, 600, Color.BLACK, TypeOfEngine.DIESEL, true
);
Motorcycle yamaha = new Motorcycle(
"Yamaha FZ1", 2007, 9000, 700, Color.GREEN, TypeOfEngine.GAS, false
);
suzuki.addDistance(1000);
suzuki.addDistance(2000);
yamaha.repair(true);
System.out.println(suzuki);
System.out.println(yamaha);
System.out.println(suzuki.equals(yamaha));
}
}
package ua.com.foxminded.carmanager;
import java.util.Objects;
public class Motorcycle {
String name;
int yearOfProduction;
int price;
int weight;
Color color;
TypeOfEngine engineType;
boolean isReadyToDrive;
private int distance = 0;
public Motorcycle (String name, int yearOfProduction, int price, int weight, Color color, TypeOfEngine engineType, boolean isReadyToDrive) {
this.name = name;
this.yearOfProduction = yearOfProduction;
this.price = price;
this.weight = weight;
this.color = color;
this.engineType = engineType;
this.isReadyToDrive = isReadyToDrive;
}
public void repair (boolean isReadyToDrive) {
isReadyToDrive = true;
}
public boolean isReadyToDrive() {
return isReadyToDrive;
}
public void addDistance(int additionalDistance) {
distance +=additionalDistance;
}
public int getDistance() {
return distance;
}
@Override
public String toString() {
return "Motorcycle{" +
"name='" + name + '\'' +
", yearOfProduction=" + yearOfProduction +
", price=" + price +
", weight=" + weight +
", color=" + color +
", engineType=" + engineType +
", isReadyToDrive=" + isReadyToDrive +
", distance=" + distance +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Motorcycle)) return false;
Motorcycle that = (Motorcycle) o;
return isReadyToDrive == that.isReadyToDrive &&
name.equals(that.name) &&
color == that.color;
}
@Override
public int hashCode() {
return Objects.hash(name, color, isReadyToDrive);
}
}
Ответы (2 шт):
Автор решения: стасевич
→ Ссылка
метод меняет значение переменой переданной в метод, т.е. происходит перекрытие поля обьекта локальной переменной в методе(т.к. у локальной переменной приоритет выше) .
именно поэтому в конструкторе применяется ключевое слово this
есть 2 варианта. изменить имя принимаемого параметра
public void repair (boolean isReady){
isReadyToDrive = true;
явно указать на поле класса словом this
public void repair(boolean isReadyToDrive) {
this.isReadyToDrive = true;
Автор решения: Дима Васильев
→ Ссылка
Что-то очень интересное написано в вашем коде, либо я не ничего не понял. Но если правильно понял, то так:
public void repair (boolean isReadyToDrive){
this.isReadyToDrive = true;
}
И метод isReadyToDrive() аналогично.