2015-01-17 1 views
0

Я слышал эту линию где-то и я не могу получить его с ума:Окончательный класс и основные последствия в Java

«Все члены конечного класса неявно окончательным.»

Теперь я очень хорошо знаю эти три известных понятий:

  1. final класса не может быть продлен.
  2. A final переменная не может быть повторно назначена с новым значением после инициализации.
  3. A final метод нельзя переопределить.

Но если все члены (переменные, методы) конечного класса неявно окончательны, то у нас есть окончательный класс И конечные переменные И конечные методы в нем.

Затем, как это возможно, что StringBuilder, несмотря на то, что он является окончательным, позволяет его содержимое менять ?!

+1

final не означает неизменяемость (см., Например, 'ArrayList') –

+3

Только методы окончательно неявно (так как они могут быть переопределены только подклассом и подклассификацией). Переменные остаются неопределенными, если не отмечены. – Dave

+0

Вы не можете переопределить любые методы в классе StringBuilder, только его текстовое содержимое может быть изменено, обратите внимание на разницу. – Biu

ответ

2

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

+0

как это «не совсем верно»? – eis

+0

@eis: Это, насколько я знаю, не указано в спецификации языка Java.Но тогда, как я уже сказал, это совершенно не имеет значения, поскольку единственная разница между окончательным и неконфигурированным методом заключается в том, что она является переопределяемой. – Darkhogg

+0

хорошо, либо это, либо нет. Вы не должны требовать, чтобы, если вы считаете, что это неправда, немного сложно судить о том, на какой стороне вы находитесь. Я согласен, что это не имеет значения. – eis

1

Класс может быть окончательным, но изменчивым.

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

И наоборот, поля и методы могут быть окончательными (и экземплярами immutable), но класс не является окончательным.

Окончательность класса и членов класса не имеет отношения.

+1

Все методы в конечном классе также неявно являются окончательными, а методы также являются членами класса. Помимо этого я согласен. – eis