Подтвердить что ты не робот

Почему не может быть создан объект абстрактного класса?

Вот сценарий в моем сознании, и у меня есть googled, Binged его много, но получил ответ как

"Абстрактный класс не реализовал метод, поэтому мы не можем создать объект" "Слово" Аннотация "инструктирует компилятор не создавать объект класса"

Но в простом классе, где у нас есть все виртуальные методы, способные создать объект???

Кроме того, мы можем определить другой доступ, модифицированный конструктором абстрактного класса, например private, protected или public.

Мой поиск завершен к этому вопросу:

Почему мы не можем создать объект абстрактного класса?

4b9b3361

Ответ 1

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

В классе abstract есть конструктор protected (по умолчанию), позволяющий инициализировать производные типы.

Например, базовый тип Stream является абстрактным. Без производного типа , куда будут идти данные? Что произойдет, если вы вызовете метод abstract? Фактической реализации метода для вызова не будет.

Ответ 2

Потому что он абстрактный и конкретный объект. Абстрактный класс похож на шаблон или пустую/частично пустую структуру, вы должны расширить его и построить на нем, прежде чем сможете его использовать.

Возьмем, к примеру, абстрактный класс "Животное". Нет такой вещи, как "чистое" животное - есть определенные типы животных. Таким образом, вы можете создать экземпляр Dog and Cat и Turtle, но вы не сможете создать экземпляр простого Animal - это просто базовый шаблон. И есть определенная функциональность, которую разделяют все животные, такие как "makeSound()",, но которые не могут быть определены на базовом уровне животных. Поэтому, если вы могли бы создать объект Animal, и вы бы назвали makeSound(),, как бы объект знал, какой звук сделать?

Ответ 3

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

http://msdn.microsoft.com/en-us/library/sf985hc5(VS.71).aspx

Абстрактный модификатор может использоваться с классы, методы, свойства, индексы и события.

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

Абстрактные классы имеют следующее особенности:

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

Ответ 4

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

abstract class A
{
    public abstract void D();
    public void E() { }
}

class B : A
{
    public override void D() { }
}

class C : A
{
    public override void D() { }
}

...

A a = new B();
a.D();
a.E();

List<A> list = new List<A>() { new B(), new C() };

Ответ 5

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

Ответ 6

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

Что касается того, почему Java не позволит вам создать его, часть его просто отказоустойчива (многие абстрактные классы будут функционировать отлично, без каких-либо дополнений, если вы не вызываете нереализованные методы).

Ответ 7

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

Ответ 9

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

myclass obj=new myclass();

Здесь using constructorr clr определяет, сколько памяти требуется объекту в зависимости от экземпляра variabless и методов. Но в случае абстрактных классов мы не можем предсказать объем требуемой памяти, поскольку мы не реализуем абстрактные методы, поэтому его невозможно создать объект.

Ответ 10

Мы не можем создать объект для абстрактного класса bcoz, в основном абстрактный класс содержит "абстрактные методы", поэтому абстрактные методы являются неполными методами. Так что мы не можем оценить память этих методов, сколько они будут занимать. Это один из почему мы не можем создать объект для абстрактного класса.

Ответ 11

Когда мы создаем чистую виртуальную функцию в абстрактном классе, мы резервируем слот для функции в VTABLE (изученный в последнем разделе), но не помещаем ни одного адреса в этот слот. Следовательно, VTABLE будет неполным.

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

Источник: Исследование Сегодня

Ответ 12

Ссылка studytonight:

Когда мы создаем чистую виртуальную функцию в абстрактном классе, мы резервируем слот для функции в VTABLE (изучен в последней теме), но не поместите любой адрес в этот слот. Следовательно, VTABLE будет неполным.

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

Ответ 13

Я не согласен с принятым ответом. Причина в том, что мы можем иметь тело для чистой виртуальной функции.

Ответ таков:

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

Ответ 14

Извините, ребята...

Вы можете создать объект для абстрактного класса, если и только если этот абстрактный класс не содержит абстрактного метода.

Вот мой пример. Скопируйте его и скомпилируйте и запустите.

abstract class Example {
  void display(){
    System.out.println("Hi I am Abstract Class.");
  }
}

class ExampleDemo {
    public static void main(String[] args) {
        Example ob = new Example(){};
        ob.display();
   }
}

Итак, ваш ответ "да", мы можем создать объект для абстрактного класса, если нет абстрактного метода. Проверьте мою программу.

Ответ 15

мы можем создать объект для абстрактного класса, как это также...

public class HelloWorld
{
    public static void main(String args[])
    {
        Person p = new Person()
        { 
            void eat()
            {
                console.writeline("sooper..");
            } 
        }; 
        p.eat();
    }
}
abstract class Person
{ 
    abstract void eat(); 
} 

Ответ 16

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