Полиморфизм в Java с методом toString и Equals для меня не имеет смысла? - PullRequest
4 голосов
/ 28 апреля 2020

Учитывая следующий код:

class Kitten {
    private String name = "";

    public Kitten(String name) {
        name = name;
    }

    public String toString() {
        return "Kitten: " + name;
    }

    public boolean equals(Object other) {
        if (this == other) return true;
        if (null == other) return false;
        if (!(other instanceof Kitten)) return false;
        Kitten that = (Kitten) other;
        return this.name.equals(that.name);
    }
}

//Assume that the Following lines have already been executed

Object maggie = new Kitten("Maggie");
Object fiona = new Kitten("Fiona");
Object fiona2 = new Kitten("Fiona");

Видимо , когда вы запустите строки кода:

> System.out.println(maggie.toString());
>
> System.out.println(fiona.equals(fiona2));
>
> System.out.println(fiona.equals(maggie));
>

Терминал выведет следующее:

>Kitten:
>
>true
>
>true

ПОЧЕМУ использует ли метод toString переопределенный метод класса Kitten, но почему-то не использует значение имени, хранящееся в magg ie?

Также как это Возможно ли, что fiona.equals (magg ie) верен?

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

1 Ответ

6 голосов
/ 28 апреля 2020

Проблема в конструкторе:

public Kitten(String name) {
    name = name;
}

Это просто присваивает параметр name самому , что является недопустимым.

Кому присвойте значение name параметра свойству name , вам нужно будет сделать:

public Kitten(String name) {
    this.name = name;
}

После его изменения ваш toString() и equals() методы будут вести себя как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...