it-roy-ru.com

Почему конструкторы не могут быть окончательными

Почему конструкторы не могут быть конечными, статическими или абстрактными в Java?

Например, можете ли вы объяснить мне, почему это недействительно?

public class K {

    abstract public K() {
        // ...
    }
}
69
sachin

Когда вы устанавливаете метод как final, это означает: «Я не хочу, чтобы какой-либо класс переопределял его». Но в соответствии со спецификацией языка Java:

JLS 8.8 - «Объявления конструктора не являются членами. Они никогда не наследуются и, следовательно, не подлежат скрытию или переопределению».

Когда вы устанавливаете метод как abstract, это означает: «Этот метод не имеет тела и должен быть реализован в дочернем классе». Но конструктор вызывается неявно, когда используется ключевое слово new, поэтому у него не может быть тела.

Когда вы устанавливаете метод как static, это означает: «Этот метод принадлежит классу, а не конкретному объекту». Но конструктор неявно вызывается для инициализации объекта, поэтому нет необходимости иметь статический конструктор.

151
user1232256

Вопрос действительно в том, почему вы хотите, чтобы конструктор был static or abstract or final.

Конструкторы не наследуются, поэтому не могут быть переопределены, так что толку иметь окончательный конструктор

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

Конструктор нельзя переопределить, так что вы будете делать с рефератом конструктор.

39
RanRag

Конструктор Java является неявно final, статические/нестатические аспекты его семантики - неявно 1и бессмысленно для конструктора Java быть абстрактным.

Это означает, что модификаторы final и static будут избыточными, а ключевое слово abstract не будет иметь никакого значения вообще.

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

За исключением: это позор, что они не сделали тот же самый вызов дизайна для методов интерфейса, где модификаторы public и abstract также избыточны, но все равно разрешены. Возможно, для этого есть какая-то (древняя) историческая причина. Но в любом случае, это нельзя исправить, не сделав (возможно) миллионы существующих Java-программ некомпилируемыми.


1 - На самом деле, конструкторы имеют смесь статической и нестатической семантики. Вы не можете "вызвать" конструктор в экземпляре, и он не наследуется и не может быть переопределен. Это похоже на работу статических методов. С другой стороны, тело конструктора может ссылаться на this и вызывать методы экземпляра ... как метод экземпляра. И затем есть цепочка конструктора, которая является уникальной для конструкторов. Но реальная суть в том, что эта семантика фиксирована, и нет смысла разрешать избыточный и, вероятно, сбивающий с толку модификатор static.

14
Stephen C
  • public конструктор : Объекты могут быть созданы где угодно.

  • конструктор по умолчанию : объекты могут быть созданы только в одном пакете.

  • protected конструктор : Объекты могут создаваться классами вне пакета, только если это подкласс.

  • private конструктор : Объект может быть создан только внутри класса (например, при реализации синглтона).

Ключевые слова static, final и abstract не имеют смысла для конструктора, потому что:

  • Члены static принадлежат классу, но конструктор необходим для создания объекта.

  • Класс abstract является частично реализованным классом, который содержит абстрактные методы для реализации в дочернем классе.

  • final ограничивает изменение: переменные становятся постоянными, методы не могут быть переопределены, а классы не могут быть унаследованы.

9
mahesh

Конструкторы НИКОГДА не могут быть объявлены как окончательные. Ваш компилятор всегда выдаст ошибку типа «модификатор final не разрешен» Final, когда применяется к методам, означает, что метод не может быть переопределен в подклассе. Конструкторы НЕ являются обычными методами. (применяются другие правила) Кроме того, конструкторы НИКОГДА не наследуются. Так что нет никакого смысла в объявлении его окончательным.

6
Jimit Rupani

Final : Потому что вы все равно не можете переписать/расширить конструктор. Вы можете расширить класс (чтобы не сделать его окончательным) или переписать метод (чтобы не сделать его окончательным), но для конструкторов ничего подобного нет.

Статический : Если вы посмотрите на выполнение, конструктор не статичен (он может получить доступ к полям экземпляра), если вы посмотрите на сторону вызывающего, он (своего рода) статичен (вы вызываете его без экземпляра. Это трудно Вообразить, что конструктор полностью статичен или не статичен и без семантического разделения между этими двумя вещами, не имеет смысла различать их с помощью модификатора.

Аннотация : Аннотация имеет смысл только при наличии перезаписи/расширения, поэтому применяется тот же аргумент, что и для 'final'

6
Jens Schauder
  1. Конструкторы НЕ являются обычными методами. (применяются разные правила)
  2. Кроме того, конструкторы НИКОГДА не наследуются. Таким образом, нет никакого смысла в объявлении его окончательным . Конструкторы НИКОГДА не могут быть объявлены окончательными. ВАШ компилятор всегда выдаст ошибку типа "модификатор final не разрешен"
  3. Проверьте раздел JLS 8.8.3 (документы JLS и API должны быть одними из ваших основных источников информации).
3
jaskirat Singh

JLS раздел 8 упоминает об этом.

Конструкторы (§8.8) похожи на методы, но не могут быть вызваны непосредственно с помощью вызова метода; они используются для инициализации нового класса экземпляров. Как и методы, они могут быть перегружены (§8.8.8).

Но конструкторы, скажем так, не являются обычными методами. Их нельзя сравнивать как таковые.

2
Oh Chin Boon

почему конструктор не может быть статическим и окончательным, хорошо определены в приведенных выше ответах. 

Аннотация: «Аннотация» означает отсутствие реализации. и это может быть реализовано только через наследование. Поэтому, когда мы расширяем некоторый класс, все члены родительского класса наследуются в подклассе (дочернем классе), кроме «Конструктора». Итак, предположим, вам как-то удается объявить конструктор "Abstract", чем как вы можете дать его реализацию в подклассе, когда конструктор не наследуется в дочернем классе? 

вот почему конструктор не может быть абстрактным. 

1
Muneeb Nasir

давайте посмотрим в первую очередь final public K () {

* над модификатором final есть ограничение limit, потому что если он final, то возникает ситуация, когда в каком-то другом классе или только в том же классе мы его переопределим, так что это не произойдет здесь, приблизительно не finaleg:

we want public void(int i,String name){
//this code not allowed

пусть static , static itz все об уровне класса, но мы создаем объектный конструктор, используя ключевое слово 'new', так , thatsall

здесь самое худшее, потому что здесь нет никакого абстрактного метода или какого-либо объявленного метода

0
veeresh kalyan