изменение метода toString - PullRequest
       10

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

0 голосов
/ 04 ноября 2011

Меня недавно попросили переписать класс, который использовал наследование, в класс, который вместо этого использовал композицию.Я столкнулся с проблемой, когда переписывал метод 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 (), и почему он не возвращает строковое значение, если нет ошибки.

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

Ответы [ 3 ]

1 голос
/ 04 ноября 2011

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

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

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

System.out.println("o=" + new Object().toString())
o=java.lang.Object@1176e5f
1 голос
/ 04 ноября 2011

На первый вопрос (почему нет ошибки компиляции) отвечает Матфей. По второму:

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

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

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

0 голосов
/ 04 ноября 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());
}
...