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


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

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

public class K {

    abstract public K() {
        // ...
    }
}
10 66

10 ответов:

когда вы устанавливаете метод как final Это означает: "вы не хотите любого класса переопределить."Но конструктор (согласно спецификации языка Java) не может быть переопределен, поэтому он чист.

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

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

вопрос в том, почему вы хотите конструктор static or abstract or final.

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

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

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

конструктор Java-это имплицитно окончательная и имплицитно статический1, а это бессмысленно для конструктора Java, чтобы быть абстрактным.

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

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

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


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

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

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

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

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

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

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

  • An abstract класс-это частично реализован класс, который содержит абстрактные методы должны быть реализованы в дочернем классе.

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

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

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

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

никакие конструкторы никогда не могут быть объявлены окончательными. Ваш компилятор всегда будет выдавать ошибку типа " модификатор final не допускается" Финал, когда применяется к методам, означает, что метод не может быть переопределен в подклассе. Конструкторы-это не обычные методы. (другие правила) Кроме того, конструкторы никогда не наследуются. Так что нет смысла объявлять его окончательным.

  1. конструкторы не являются обычными методами. (другие правила)
  2. кроме того, конструкторы никогда не наследуются. Так что нет смысла объявлять его окончательным. никакие конструкторы никогда не могут быть объявлены окончательными. Ваш компилятор всегда будет выдавать ошибку типа "modifer final not allowed"
  3. проверьте раздел 8.8.3 JLS (документы JLS & API должны быть некоторыми из ваших основных источников информации).

JLS 8 упоминает об этом.

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

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

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

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

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

давайте посмотрим сначала окончательный публичный K () {

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

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

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

абстрактный itz хуже всего здесь не на ' Потому что не имеют никакого абстрактного метод или любой объявленный метод