Почему нельзя создать объект абстрактного класса? - PullRequest
18 голосов
/ 23 апреля 2010

Вот сценарий в моей голове, и я гуглил, много гнул, но получил ответ вроде

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

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

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

Мой поиск окончен на этот вопрос:

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

Ответы [ 16 ]

0 голосов
/ 12 апреля 2014

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

myclass obj=new myclass();

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

0 голосов
/ 30 января 2014

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

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(); 
} 
0 голосов
/ 21 декабря 2013

Простите, ребята ...

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

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

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();
   }
}

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

0 голосов
/ 12 ноября 2013

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

Ответ таков:

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

0 голосов
/ 25 июня 2012

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

0 голосов
/ 23 апреля 2010

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

В чем полезность открытых конструкторов в абстрактных классах в C #?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...