it-swarm.com.ru

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

Я понимаю:

  1. Поскольку класс Abstract сам по себе не является ничем, т. Е. Средством, поэтому мы хотим создать объект конкретной реализации, такой как Car, Bike и т.д.
  2. Конструктор класса Abstract вызывается во время цепочки объектов.

  3. Мы никогда не сможем напрямую создать объект класса Abstract, даже если он содержит конструктор и все методы реализованы 

зачем ? Я хочу понять с точки зрения компилятора, почему Java заставляет их?

Спасибо 

10
sandejai

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

10
Eli Iser

Абстрактный класс не завершен! Автор пометил это как абстрактное, чтобы сказать вам, что в коде отсутствует некоторая реализация . Автор проделал часть работы, но вы должны заполнить некоторые части самостоятельно, чтобы она заработала. Ключевое слово abstract гарантирует, что никто не будет случайно инициировать этот неполный класс.

Подумайте о ремонте автомобиля. Кто-то снял тормозные колодки и собирается заменить их на следующий день. Теперь, чтобы предотвратить случайное вождение этого автомобиля (на котором не установлены тормоза), механик устанавливает блокировку рулевого колеса. Это надежная мера.

17
kevin

rocketboy показывает некоторые механистические причины, но есть концептуальная причина.

Абстрактный класс представляет абстрактное понятие. Возьмите пример с вашим автомобилем. Вы не можете создать транспортное средство, которое не является чем-то более конкретным. У вас может быть набор транспортных средств, которые могут быть изготовлены из эскортов Ford Corolla 2004 года и Ford '98 и Cs36 1984 года (разновидность яхты), среднетоннажный транспорт среднего класса класса 4 (тот, что со стабилизаторами), вы можете возьмите любой из них по отдельности и назовите их транспортным средством, но у вас не может быть чего-то, что является только транспортным средством, а не одним из тех или другого определенного типа транспортного средства.

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

5
Taylor
  1. Если класс помечен ключевым словом abstract, то он называется абстрактный класс. Его нельзя создать с помощью оператора new. Но абстрактный класс можно использовать как ссылку на суперкласс для объекта подкласса.

  2. Класс, который НЕ является абстрактным, называется конкретным классом.

  3. В Java API так много абстрактных классов, и большинство из них включают в библиотеку GUI и платформу коллекций.

  4. Абстрактный класс должен быть расширен, а абстрактный метод должен быть переопределен

  5. Если метод объявлен с ключевым словом abstract, тогда он НЕ должен иметь тела. Только он может иметь имя, параметры и тип возвращаемого значения, но НЕ тело

  6. Если у вас есть абстрактный метод, то класс также должен быть объявлен как abtracr, т.е. конкретный класс НЕ МОЖЕТ иметь абстрактные методы, только абстрактный класс может иметь абстрактные методы.

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

  8. Если конкретный класс расширяет абстрактный класс, он должен переопределить все абстрактные методы абстрактного суперкласса, и это называется реализацией абстрактного класса.

  9. Для частичной реализации абстрактного класса мы можем взять абстрактный подкласс, который может расширить абстрактный суперкласс. В этой ситуации подкласс, переопределяющий все абстрактные методы абстрактного суперкласса, НЕ необходим. Частичная реализация абстрактного суперкласса или интерфейса может быть выполнена только абстрактными классами. Конкретный класс НЕ может использоваться для частичной реализации абстрактного класса, потому что конкретные классы НЕ могут иметь абстрактные методы.

  10. Абстрактные классы и абстрактные методы НЕ могут быть объявлены с ключевым словом final, т. Е. Класс может быть абстрактным или конечным, точно так же как метод может быть абстрактным для final

  11. Абстрактные методы НЕ могут быть объявлены с ключевым словом private

  12. Абстрактные методы НЕ могут быть объявлены с синхронизированным ключевым словом. Даже если вам нужен потокобезопасный метод, тогда во время реализации абстрактного класса (когда абстрактный метод будет переопределен конкретным подклассом) переопределенный метод может быть помечен с помощью ключевого слова synchronized.

  13. Абстрактные методы НЕ могут быть помечены ключевым словом static. Поскольку статические методы НЕ могут быть переопределены, только они могут быть скрыты статическими методами подкласса.

  14. Абстрактный метод НЕ может быть помечен ключевым словом native

  15. Абстрактный метод НЕ может быть помечен ключевым словом strictfp

  16. Так что только вы можете использовать модификатор доступа (отличный от частного), тип, параметр с абстрактным методом

  17. Конкретный класс НЕ может иметь методы экземпляра, но абстрактный класс может иметь абстрактные методы, статические члены, члены экземпляра, статические инициализаторы, конструкторы и инициализатор экземпляра.

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

  19. Может также случиться, что абстрактный класс НЕ имеет никаких абстрактных методов

  20. Абстрактный класс НЕ может быть создан с помощью оператора new. Поскольку реферат может иметь абстрактные методы, то есть методы без какого-либо тела (или реализации). Поскольку объект НЕ может иметь абстрактные методы, а JVM НЕ может выделять память абстрактных методов

4
alexvipul

Поскольку абстрактный класс является каркасной структурой (если возможно, неполной конструкцией), отсюда и термин абстрактный.

abstract class Person(){
   abstract void Speak();
}

Значит каждый Person должен говорить. Это означает, что каждый человек должен знать, как говорить (реализовать speak()). new Person() не может иметь этого, поэтому это не разрешено.

1
rocketboy

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

1
Sunil S

Что я понимаю, что Абстрактные классы могут содержать абстрактные (пустые без реализации) методы. Если мы создадим объект и вызовем пустой метод, он не будет работать и может вызвать проблемы, следовательно, компилятор заставляет это ПРАВИЛО . Еще дальше?

1
sandejai

Абстрактный класс - это класс, который объявлен как абстрактный. Может включать или не включать абстрактные методы. 

Мы должны объявить класс Abstract и методы Abstract с ключом Word abstract.

Абстрактные классы не могут быть созданы, это означает, что мы не можем создать объект для абстрактного класса. Мы можем создать Подклассы в Абстрактные классы.

Абстрактный класс может иметь или не иметь абстрактные методы, абстрактный метод в том смысле, что метод может быть объявлен без какой-либо реализации тела, называется абстрактным методом. Таким образом, в этом случае JVM не знает, сколько памяти нужно выделить для этого абстрактного метода, потому что у абстрактного метода нет реализации тела. Поэтому JVM не сможет выделить память для абстрактных методов во время создания экземпляра для абстрактного класса. Таким образом, JVM не может создать экземпляр класса Abstract. Так что мы не можем создать объект для класса Abstract. 

Также возможно, что мы можем создать класс Abstract со всеми конкретными методами, то есть без каких-либо абстрактных методов. В этом случае мы также не можем создать экземпляр для класса Abstract. Почему, потому что абстрактное ключевое слово просто указывает JVM, что класс не может быть создан. 

Разработчики Java создали JVM, которая, когда находит абстрактное ключевое слово для любого класса, JVM не может создать экземпляр для этого класса.

1
Sumedh Tambat

абстрактный сам говорит: существующий в мыслях или в виде идеи, но не имеющий физического или конкретного существования . В термине Java определение абстрактного ключевого слова, если абстрактное предшествует имени класса, то JDK сообщает JVM об отбрасывании этого объекта класса инициация. Это верно, абстрактный класс может иметь несколько конструкторов, но только для цепочки конструкторов. 

1
Rudra

Вы МОЖЕТЕ создать экземпляр абстрактного класса. Вам нужно только предоставить конкретный подкласс. 

0
Srinath Shah

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

0
Sonu patel

очень простая причина, по которой игра jvm ограничивает нас в создании абстрактного класса и интерфейса. 

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

Итак, предположим, что мой абстрактный класс содержит 5 абстрактных методов, означает только прототип метода без тела метода. 

Итак, как мы знаем, каждый вызов метода создает отдельный стек в области стека Java jvm Это распределение памяти происходило на основе структуры метода И после выполнения этот стек разрушает право.

Так что, если мой метод не содержит никакого тела, значит, как jvm может предсказать память, чтобы выделить этот метод 

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

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

0
naila naseem

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

И если вы хотите начать свой класс, то почему вы хотите определить его как abstract ?

0
Ankita P.

Поскольку Java ограничил это, поэтому мы не можем создать экземпляр абстрактного класса. Потому что в общем сценарии абстрактное означает неполное, поэтому мы не можем сделать объект незавершенным. Мы должны обеспечить полную реализацию абстрактного класса в конкретном классе. Но мы не можем создать объект абстрактного класса.

0
Bharti Rawat