2009-05-17 2 views
2

Каково обоснование отсутствия конструкторов no-arg в классах Wrapper? Я знаю, что они были встроены для примитивных типов Wrapping, поэтому правильный способ - создать примитивный тип для конструкторов. Но, учитывая, что примитивные типы имеют конструктор no-arg, почему у них нет?Почему классы Java Wrapper не имеют конструкторов no-arg?

Кроме того, если у них были конструкторы no-arg, они могут быть созданы как T.class.newInstance(). Однако, поскольку newInstance() требует конструктора no-arg, это не будет работать с классами Wrapper.

Заранее спасибо.

Редактировать: Спасибо John Topley за исправление моей терминологии.

+4

Ваша терминология неверна. Конструктор по умолчанию предоставляется компилятором, когда вы не предоставляете конструктор без аргументов. См. Http://java.sun.com/docs/books/tutorial/java/javaOO/constructors.html –

+1

Это не совсем неверно. В классах «обертка» нет конструктора по умолчанию, потому что у всех из них есть как минимум один конструктор в своем источнике. –

+3

@John - Ваша собственная цитата говорит, что вы неверны: «Компилятор автоматически предоставляет конструктор по умолчанию без аргументов для любого класса без конструкторов.«Компилятор предоставляет no-arg ctor только для классов без конструкторов. – duffymo

ответ

11

Оберточные объекты неизменяемы. Это означает, что после того, как объект-оболочка имеет назначенное ему значение, это значение не может быть изменено. Не имеет смысла иметь значение по умолчанию для объекта, значение которого не может быть изменено. Вы бы не хотели , чтобы получить класс оболочки newInstance(), потому что тогда вы застряли со значением по умолчанию.

0

Скорее всего, потому что, хотя примитивы имеют значение по умолчанию (0, 0.0f, 0.0, 0L, false и т. Д.), Wrappers обычно выражают эти значения по умолчанию как null.

2

Я думаю, это потому, что значения, обернутые эти классы предназначены для окончательного неизменен (что было слово, которое я искал, спасибо Биллу :)). Если бы был конструктор по умолчанию, это было бы совершенно бесполезно, поскольку вы не могли бы изменить примитив, завершенный классом позже.

2

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

1

Лучший вопрос в том, почему у них есть конструкторы вообще. Нас просто интересует ценность. Идентификатор объекта не имеет значения для значения типов.

Большинство (но не всех) применений отражения бессмысленно. Построение неизменной ценности, подобной этой, было бы очень мало ценным. Class.newInstance особенно злобный из-за его поведения исключения. T.class, где T является общим параметром, не будет скомпилирован из-за стирания.

1

Только объекты имеют конструкторы, примитивы не имеют конструкторов, поэтому у них нет конструктора по умолчанию. Примитивы получают свое значение по умолчанию в силу того, что объекты/значения инициализируются для всех 0 байтов. (Который является ложным в boolean, 0.0f в float, 0.0 в double и null как ссылка)

Вы, похоже, хотите создать объект с помощью newInstance(), но единственным неинициализированным значением является null.

Смежные вопросы