Как Java различает почти идентичные конструкторы во время явного вызова конструктора?

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

private int x, y;
private int width, height;

public Rectangle() {
    this(0, 0, 1, 1);
}

public Rectangle(int width, int height) {
    this(0, 0, width, height);
}

public Rectangle(short x, short y, int width, int height) {
    this.x = (int) x+4;
    this.y = (int) y+4;
    this.width = width;
    this.height = height;
}

public Rectangle(int x, int y, int width, int height) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
}

В конструкторе по умолчанию «это (0,0,1,1);» строка не указывает типы нулей. Мой вопрос в том, почему он не переходит к третьему конструктору, который я написал (с «короткими» типами), или выдает ошибки. Когда я распечатываю значение «x» объекта, я всегда получаю 0 и никогда не получаю 4. Как Java решает использовать «int»?


person degemenc    schedule 08.03.2018    source источник


Ответы (1)


В конструкторе по умолчанию «это (0,0,1,1);» строка не указывает типы 0

Это неверное утверждение. Целочисленные числовые литералы (без суффикса) всегда равны ints (поэтому такой литерал, как 3000000000, будет ошибкой компиляции, поскольку это значение слишком велико для int). Поэтому выбирается последний конструктор - Rectangle(int x, int y, int width, int height).

person Eran    schedule 08.03.2018
comment
Хорошо, но когда я изменяю конструктор по умолчанию следующим образом ((short) 0, (short) 0, 1, 1); он все еще идет к последнему конструктору. - person degemenc; 08.03.2018
comment
@DerivedEngineer нет, this( (short) 0, (short) 0, 1, 1) вызовет конструктор Rectangle(short x, short y, int width, int height). Вы должны ошибаться. - person Eran; 08.03.2018
comment
ага, моя ошибка. Спасибо. - person degemenc; 08.03.2018