Поведение оператора Java + не наследуется должным образом - PullRequest
1 голос
/ 06 июля 2019

Я учусь создавать классы на Java, но столкнулся со странным поведением.

Я хочу создать класс с именем My_class, который имеет метод с именем add. Метод должен взять элемент My_class и добавить его к другому элементу My_class, указанному в скобках.

Например, запустив это:

My_class first = new My_class(2);
My_class second = new My_class(6);
My_class answer = first.add(second);
System.out.println(answer);

Следует напечатать:

8

Вот код, который я использую для My_class, но я продолжаю сталкиваться с проблемами, связанными с тем, как My_class работает с оператором +. Я думал, что, поскольку My_class наследуется от int, проблем быть не должно, но, очевидно, я упускаю что-то фундаментальное.

public class My_class {
    /* Data members*/
    private int integer;

    /* Constructors */
    public My_class(int i) {integer = i;}

    /* Methods */
    public My_class add(My_class new_integer) {
        return integer + new_integer;
    }

Вместо ожидаемого результата я получаю:

The operator + is undefined for the argument type(s) int, My_class

Заранее спасибо за любую помощь!

1 Ответ

6 голосов
/ 06 июля 2019

Как говорится в сообщении об ошибке, вы пытаетесь добавить int (integer) и My_class (new_integer).Вы не можете этого сделать.

Если вы хотите использовать поле integer из new_integer, вам необходимо получить к нему доступ явно:

return integer + new_integer.integer;
// -------------------------^^^^^^^^

(Вероятно, лучше всего переименоватьПараметр new_integer указывает на то, что это не означает, что это int, поскольку это не так, это экземпляр My_class.)

Выше приведено int, поэтому метод будетбыть:

public int add(My_class new_integer) {
// ----^^^
    return integer + new_integer.integer;
}

Если вы хотите сохранить My_class возвращаемое значение add, вам нужно создать My_class экземпляр:

public My_class add(My_class new_integer) {
    return new My_class(integer + new_integer.integer);
    // ----^^^^^^^^^^^^^-----------------------------^
}

Сторонапримечание: я также настоятельно рекомендую всегда использовать this. при доступе к членам экземпляра класса, поэтому:

return this.integer + new_integer.integer;
// ----^^^^^

Это вопрос стиля (компилятор Java будет выводить this., где это необходимо), но IMHOэто улучшает ясность, поскольку integer само по себе может быть локальной переменной, именем класса (хотя, мы надеемся, нет), статическим членом, ...


Примечание 2: Хотя вы можете сделатьЧто бы вы ни хотели в своем собственном коде, подавляющее соглашение (также официальное, PDF ) заключается в использовании смешанного регистра сзаглавная буква, начинающаяся с каждого слова, поэтому MyClass вместо My_class.

...