2013-12-16 2 views
6

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

public String toString() { 
    return "(" + x + "," + y + ")"; 
} 

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

+6

Подумайте о x и y. Если они нестатические поля, статический метод не может получить к ним доступ. –

+0

@PatriciaShanahan, так что вы говорите, что если x и y были статическими значениями, метод toString() может быть установлен как статический? –

+0

Ваше понимание 'static' немного не работает. 'static' означает, что создается только один экземпляр (по крайней мере для переменных). Вы можете получить доступ к «статическим» переменным/методам, даже не создавая экземпляр объекта (например, «ClassName.toString()». Кроме того, вам не нужно создавать новый метод для каждого объекта, все они имеют один и тот же метод – Justin

ответ

8

Это не относится только к toString()

Java Language Specification говорит

Это ошибка времени компиляции, если статический метод hides экземпляр метод.

Так как метод экземпляра toString() неявно унаследованный от Object, объявить метод toString() как static в типе суб вызывает ошибку во время компиляции.

От объекта Ориентированная точка зрения, см. Другие ответы на этот вопрос или вопросы related.

+0

в этом случае применяется к 'equals()', 'hashCode()' и т. Д. – Justin

+0

@Quincunx Да, любой метод видимого экземпляра. –

4

Поскольку статический метод не может получить доступ к полям экземпляра. Кроме того, toString() указан java.lang.Object, поэтому у вас должен быть экземпляр объекта для вызова toString(). Наконец, если toString() были статическими, ему пришлось бы принимать экземпляры Object (как еще вы могли бы вызвать toString() в n экземпляре класса?).