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

Я понимаю:

  • Так как абстрактный класс - это не что-то само по себе, т.е. транспортное средство, поэтому мы хотим создать объект конкретной реализации, такой как Car, Bike и т.д.
  • Конструктор абстрактного класса вызывается во время цепочки объектов.

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

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

Спасибо

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

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

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

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

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

Ответ 10

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

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

Ответ 11

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

Ответ 12

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

Предположим, что компилятор позволяет создавать экземпляры как ok.

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

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

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

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

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

Ответ 13

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

Ответ 14

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

Ответ 15

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

/**
 * A classic adaptor pattern.
 *
 * @param <P>
 * @param <Q>
 */
public static interface Adapter<P, Q> {

  public Q adapt(P p);

}

/**
 * An I walks an iterator of one type but delivers items of a different type.
 *
 * Please fill in the `next()` method. Use an Adaptor for convenience.
 *
 * @param <S>
 * @param <T>
 */
public abstract static class I<S, T> implements Iterator<T> {

  protected final Iterator<S> it;

  public I(Iterator<S> it) {
    this.it = it;
  }

  @Override
  public boolean hasNext() {
    return it.hasNext();
  }

  @Override
  public void remove() {
    it.remove();
  }

}

/**
 * Use an adaptor to transform one type into another.
 *
 * @param <S>
 * @param <T>
 */
public static class IA<S, T> extends I<S, T> {

  private final Adapter<S, T> adaptor;

  public IA(Iterator<S> it, Adapter<S, T> adaptor) {
    super(it);
    this.adaptor = adaptor;
  }

  @Override
  public T next() {
    // Implement the abstract method on-the-fly.
    return adaptor.adapt(it.next());
  }

}

Добавлено

Класс IA создает объект абстрактного класса I и реализует метод next, отсутствующий в классе I. Вы фактически создаете объект анонимного, который реализует подразумеваемый абстрактный метод.

Ответ 16

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

Ответ 17

AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> listView, View view, int position, long id) {
        if(position==0)
        {
            Intent intent=new Intent(Top.this,Category.class);
            startActivity(intent);
        }
    }
};