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

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

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

public String toString()
{
    return String.format(
    "%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f\n%s: %.2f\n%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 %s\n%s: %s\n%s: %.2f\n%s: %.2f\n%s: %.2f\n%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(), и почему он не возвращает строковое значение, если ошибки нет.

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


person smkelsey    schedule 04.11.2011    source источник
comment
›метод toString() не возвращал строковое значение Что вместо этого он возвращал?   -  person Boann    schedule 04.11.2011
comment
если сигнатура метода должна была возвращать строку, она должна была вернуть какую-то строку, иначе возникла бы проблема во время компиляции. Нам нужно больше информации, чтобы ответить на вопрос.   -  person John B    schedule 04.11.2011
comment
Вы договорились с этим public void outPut() за public String toString()? Не совсем понятно.   -  person Bhesh Gurung    schedule 04.11.2011
comment
Сначала я создал объект класса, который содержит метод toString, его имя было base. затем в основном классе я вызвал метод следующим образом: base.toString(); когда я запускаю программу, хотя она должна возвращать строку, это не так, вместо этого она запускает программу без каких-либо результатов.   -  person smkelsey    schedule 04.11.2011
comment
@smkelsey: Вы понимаете, что вызов toString() только возвращает строку, да? Он его не отображает. Используйте 1_   -  person Boann    schedule 04.11.2011
comment
Чёрт возьми, задание требовало вывода пользователю, а toString() у меня не работало.   -  person smkelsey    schedule 04.11.2011
comment
О, я не знал, что Boann большое спасибо, что решает мою проблему.   -  person smkelsey    schedule 04.11.2011
comment
Если это домашнее задание, оно должно быть помечено как таковое.   -  person Thom    schedule 04.11.2011


Ответы (3)


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

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

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

System.out.println("o=" + new Object().toString())
o=java.lang.Object@1176e5f
person Matthew Farwell    schedule 04.11.2011
comment
Я думаю, что он имел в виду, что при определении метода toString() он не получил ни ошибок времени компиляции, ни ошибок времени выполнения, но не получил ожидаемых результатов. - person Laf; 04.11.2011

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

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

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

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

person Gyula    schedule 04.11.2011
comment
Я неправильно вызывал метод toString(). У меня сложилось впечатление, что при возврате значения String оно будет напечатано, поэтому я использовал base.toString(); Вместо system.out.print(база); Я чувствую себя довольно глупо. Спасибо за помощь. - person smkelsey; 04.11.2011

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

@Override
public String toString()
{
    return String.format(
    "%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f\n%s: %.2f\n%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());
}
person CamelSlack    schedule 04.11.2011
comment
@Override не требуется. Это просто для вашей безопасности. - person Bhesh Gurung; 04.11.2011
comment
@Override это только подсказка для разработчика. Это не влияет на то, действительно ли метод переопределен или нет. - person Boann; 04.11.2011
comment
@Override не влияет на поведение во время выполнения, и его отключение не имеет никакого эффекта. - person John B; 04.11.2011
comment
Я просто спрошу своего учителя, когда увижу его в следующий раз. Переопределение не имело никакого эффекта, как вы сказали. - person smkelsey; 04.11.2011