Цепочка конструктора и видимость в Java - PullRequest
0 голосов
/ 01 сентября 2018

Рассмотрим этот класс:

public class Passenger {
  public Passenger() {

  }

  public Passenger(int freeBags) {
      this(freeBags > 1 ? 25.0d : 50.0d);
      this.freeBags = freeBags;
  }

  public Passenger(int freeBags, int checkedBags) {
      this(freeBags);
      this.checkedBags = checkedBags;
  }

  private Passenger(double perBagFee) {
      this.perBagFee = this.perBagFee;
  }
}


Passenger fred = new Passenger(2);

Если я правильно понимаю, «Фред» - это новый экземпляр «Пассажира». 'fred' вызывает конструктор с одним параметром public Passgener(int freeBags). Затем вызывается эта строка this(freeBags > 1 ? 25.0d : 50.0d). Вот мой вопрос: как компилятор узнает, что условный оператор в первом конструкторе связан с конструктором 'private'? Я думаю, что 'd' в условном выражении указывает на двойной параметр в приватном конструкторе. Но что, если бы был другой конструктор с двойным параметром? К чему бы он тогда приковал? В первом конструкторе нет упоминания perBagFee. Я немного запутался.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

То, что вы видите, называется Перегрузка

Перегрузка - это концепция, используемая для избежания избыточного кода, где тот же Имя метода используется несколько раз, но с другим набором параметры. Фактический метод, который вызывается во время выполнения разрешается во время компиляции, что позволяет избежать ошибок во время выполнения.

Java не запоминает имена переменных метода, чтобы определить, какой перегруженный конструктор будет вызываться, вместо этого Java пытается сопоставить тип переменной

Passenger(int) -> Passenger(10)

Passenger(int, int) -> Passenger(10,10)

Passenger(double) -> Passenger(2.5d)

Итак, если вы определили другой конструктор того же шаблона, что и Passenger(double) , Java выдаст ошибку времени компиляции

конструктор Passenger (double) уже определен в классе Passenger

0 голосов
/ 01 сентября 2018

EDIT

Как компилятор узнает, что условный оператор в первом конструкторе соединяется с конструктором 'private'?

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

Я думаю, что 'd' в условном выражении указывает на двойной параметр в приватном конструкторе.

Суффикс .0d просто говорит, что это двойные значения.

В первом конструкторе нет упоминания perBagFee

Имена аргументов метода не имеют никакого отношения вне самого метода. Компилятор всегда проверяет, к какому объекту относится ваше выражение, чтобы выяснить, какой метод вы хотите вызвать.

Но что, если был другой конструктор с двойным параметром?

Попробуйте :) В одном и том же классе вы не можете определить два метода (конструктор или нет) с одинаковой сигнатурой, независимо от видимости. Официальные документы по перегрузке методов :

Перегруженные методы различаются по количеству и типу аргументов , передаваемых в метод.

Вы не можете объявить более одного метода с тем же именем и тем же числом и типом аргументов , потому что компилятор не может их различать.

...