Статус:
Offline
Реєстрація: 26.07.2010
Повідом.: 52
Реєстрація: 26.07.2010
Повідом.: 52
- 🟢 11:57 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
- #1
Привествую. Прочитал несколько страниц, разобрался с программой, но не разобрался с одним методом до конца.
есть три класса:
суперкласс class Employee
далее, его потомок class Manager extends Employee
и основной класс EqualsTest
Если взять отдельную строчку, например
Всё понятно, вызываем метод .equals, проверяем или alice1 ссылается на тот же объект, что и alice2. Возвращаем true.
Далее, берём следующую строчку
Тоже всё понятно, это разные объект, объект alice3 не нулевой, далее проверяется getClass() на идентичность класса alice1 и alice3, если они идентичны то, происходит преобразование типа alice3 и, проверяются поля. Если они одинаковые, возвращается true.
Не понятно, почему true происходит в случае
Почему getClass() сравнивая разные типы Manager и Employee выдаёт true?
Когда я спрашивал про принцип постановки то, там надо было сделать преобразование для установки бонуса менеджеру типа Employee ((Manager)employee[1]).setBonus(500);
или пробежаться по массиву и проверить не является ли элемент экземпляром.
что-то я совсем запутался уже.
P.S> Спасибо за Ваше время!
может в подклассе при переопределении метода equals(Object otherObject)
нужно добавить строку, типа:
тогда сравнивая два объекта Manager(...) с разными типами метод будет возвращать значение false;
Правильно?
есть три класса:
суперкласс class Employee
Код:
import java.util.*;
class Employee {
private String name;
private double salary;
private Date hireDay;
Employee(String name, double salary, int year, int month, int day) {
this.name = name;
this.salary = salary;
GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
hireDay = calendar.getTime();
}
public String getName() { return name; }
public double getSalary() { return salary; }
public Date getHireDay() { return hireDay; }
public String toString() {
return name + " " + salary + " " + hireDay;
}
public boolean equals(Object otherObject) {
if(this == otherObject) return true;
if(otherObject == null) return false;
if(getClass() != otherObject.getClass()) return false;
Employee other = (Employee)otherObject;
return name.equals(other.name)
&& salary == new Double(other.salary)
&& hireDay.equals(other.hireDay);
}
public int hashCode() {
return 7 * name.hashCode() +
11 * new Double(salary).hashCode() +
13 * hireDay.hashCode();
}
}
Код:
class Manager extends Employee {
private double bonus;
Manager(String name, double salary, int year, int month, int day) {
super(name, salary, year, month, day);
bonus = 0;
}
public void setBonus(double bonus) { this.bonus = bonus; }
public double getSalary() { return super.getSalary() + bonus; }
public String toString() { return super.toString() + " " + bonus; }
public boolean equals(Object otherObject) {
if(!super.equals(otherObject)) return false;
Manager other = (Manager)otherObject;
return bonus == other.bonus;
}
public int hashCode() { return super.hashCode() + 17 * new Double(bonus).hashCode(); }
}
Код:
public class EqualsTest {
public static void main(String[] args) {
Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
Employee alice2 = alice1;
Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);
System.out.println("alice1 == alice2: " + (alice1 == alice2));
System.out.println("alice1 == alice3: " + (alice1 == alice3));
System.out.println("alice1.equals(alice2): " + alice1.equals(alice2));
System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));
System.out.println("alice1.equals(bob): " + alice1.equals(bob));
System.out.println("bob.toString(): " + bob);
Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);
Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
boss.setBonus(5000);
System.out.println("boss.toString: " + boss);
System.out.println("carl.equals(boss):" + carl.equals(boss));
System.out.println("alice1.hashCode(): " + alice1.hashCode());
System.out.println("alice3.hashCode(): " + alice3.hashCode());
System.out.println("carl.hashCode(): " + carl.hashCode());
System.out.println("bob.hashCode(): " + bob.hashCode());
Employee mark = new Manager("Mark", 80000, 1980, 10, 1);
Manager kram = new Manager("Mark", 80000, 1980, 10, 1);
System.out.println("mark.equals(kram): " + mark.equals(kram));
}
}
Если взять отдельную строчку, например
Код:
System.out.println("alice1.equals(alice2): " + alice1.equals(alice2));
Далее, берём следующую строчку
Код:
System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));
Не понятно, почему true происходит в случае
Код:
Employee mark = new Manager("Mark", 80000, 1980, 10, 1);
Manager kram = new Manager("Mark", 80000, 1980, 10, 1);
System.out.println("mark.equals(kram): " + mark.equals(kram));
Почему getClass() сравнивая разные типы Manager и Employee выдаёт true?
Код:
if(getClass() != otherObject.getClass()) return false;
или пробежаться по массиву и проверить не является ли элемент экземпляром.
Код:
if(employee[i] instanceof Manager)
((Manager)employee[i]).setBonus(500;
что-то я совсем запутался уже.

P.S> Спасибо за Ваше время!
может в подклассе при переопределении метода equals(Object otherObject)
Код:
if(getClass() != otherObject.getClass()) return false;
Код:
if(ohterObject instanceof Employee) return false;
тогда сравнивая два объекта Manager(...) с разными типами метод будет возвращать значение false;
Правильно?

Останнє редагування: