изменение метода toString

#java #tostring

#java #tostring

Вопрос:

Недавно меня попросили переписать класс, который использовал наследование, в класс, который вместо этого использовал композицию. Я столкнулся с проблемой, когда переписывал метод toString(); метод toString() не вернул строковое значение, и я не получил ошибку времени выполнения или ошибку компиляции. В итоге я изменил возвращаемое значение на void, а имя метода на output. поэтому вместо возврата строкового значения я использовал system.out

моя попытка использовать toString

 public String toString()
{
    return String.format(
    "%s: %s %sn%s: %sn%s: %.2fn%s: %.2fn%s: %.2fn%s: %.2f",
    "based-salaried commission employee", cEmp.getFirstName(), cEmp.getLastName(),
    "social security number", cEmp.getSocialSecurityNumber(),
    "gross sales", cEmp.getGrossSales(),
    "commission rate", cEmp.getCommissionRate(),
    "base salary",baseSalary,
    "earnings", earnings());
}
  

с чем я согласился

 public void outPut()
{
    System.out.printf(
    "%s: %s %sn%s: %sn%s: %.2fn%s: %.2fn%s: %.2fn%s: %.2f",
    "based-salaried commission employee", cEmp.getFirstName(), cEmp.getLastName(),
    "social security number", cEmp.getSocialSecurityNumber(),
    "gross sales", cEmp.getGrossSales(),
    "commission rate", cEmp.getCommissionRate(),
    "base salary",baseSalary,
    "earnings", earnings());
}
  

Мой вопрос в том, почему я не получаю ошибку компиляции или времени выполнения от javac, когда я использую метод toString(), и почему он не возвращает строковое значение, если ошибки нет.

надеюсь, это не слишком странный вопрос.

Комментарии:

1. > «метод toString() не вернул бы строковое значение» Что он вернул вместо этого?

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

3. Вы согласились с этим public void outPut() для public String toString() ? Не совсем имеет смысл.

4. Сначала я создал объект класса, который содержит метод toString, его имя было base. затем в основном классе я вызвал метод, подобный so base.toString(); когда я запускаю программу, хотя она должна возвращать строку, она этого не делает, вместо этого она запускает программу без вывода чего-либо подобного.

5. @smkelsey: Вы понимаете, что вызов toString() только возвращает строку, да? Он не отображает его. Использовать System.out.println(base);

Ответ №1:

Object (класс, от которого в конечном итоге наследуются все объекты Java) определяет свой собственный метод toString(). Следовательно, если вы не переопределите метод toString() в своем классе, то он будет использовать метод, определенный в Object() (или любые промежуточные классы между вашим классом и объектом).

Вот почему, если вы не определяете метод toString(), вы не получаете ошибку от javac.

Обычно это приводит к строке типа

 System.out.println("o="   new Object().toString())
o=java.lang.Object@1176e5f
  

Комментарии:

1. Я думаю, что он имел в виду, что при определении toString() метода он не получил ни ошибок во время компиляции, ни каких-либо ошибок во время выполнения, но не получил ожидаемых результатов.

Ответ №2:

На первый вопрос (почему нет ошибки компиляции) отвечает Мэтью. Что касается второго:

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

Возможные ошибки: Может быть какая-то тривиальная ошибка подключения. Т.е. ошибочное использование / тестовый пример: например, используется / тестируется другой объект другого класса, отличный от того, который вы реализовали. Или ошибка компиляции: ваш код еще не скомпилирован, при тестировании используется другая (возможно, старая) версия. Или что-то подобное «тривиальной» проблеме 🙂 Другими словами:

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

Комментарии:

1. Я неправильно вызывал метод toString(). У меня создалось впечатление, что, возвращая строковое значение, оно было бы напечатано, поэтому я использовал base.toString(); Вместо system.out.print(base); Я чувствую себя довольно глупо. Спасибо за помощь.

Ответ №3:

Вам нужно добавить @Override выше функцию.

 @Override
public String toString()
{
    return String.format(
    "%s: %s %sn%s: %sn%s: %.2fn%s: %.2fn%s: %.2fn%s: %.2f",
    "based-salaried commission employee", cEmp.getFirstName(), cEmp.getLastName(),
    "social security number", cEmp.getSocialSecurityNumber(),
    "gross sales", cEmp.getGrossSales(),
    "commission rate", cEmp.getCommissionRate(),
    "base salary",baseSalary,
    "earnings", earnings());
}
  

Комментарии:

1. @Override не требуется. Это просто для вашей безопасности.

2. @Override это только подсказка для разработчика. Это не влияет на то, действительно ли метод переопределен или нет.

3. @Override не влияет на поведение во время выполнения, и его отсутствие не влияет

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