Массив абстрактного класса

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

public abstract class Game{
  ...
}

Game games = new Game(); //Error
Game[] gamesArray = new Game[10]; //No Error

8 ответов


Game[] gamesArray = new Game[10];

создание экземпляра означает создание экземпляра класса. В приведенном выше сценарии, вы только что объявили gamesArray типа Game С размерами 10(только ссылки и ничего больше). Вот почему он не бросает никакой ошибки.

вы получите ошибку, когда попытаетесь сделать

gamesArray[0] = new Game(); // because abstract class cannot be instantiated

но сделать массив абстрактного класса?

позже, вы можете сделать что-то подобное

gamesArray[0] = new NonAbstractGame(); // where NonAbstractGame extends the Games abstract class.

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


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

new Game[10]; дает 10 слотов для Game ссылки, но это не делает один Game.


потому что вы не нарушаете abstract class правила.По существу,

Game games = new Game();

разбивается на:

Game games; //Will Work because it's just a declaration
games=new Game(); //Will not work because it's instantiation

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


- An Abstract класс-это тот, чей экземпляр не может быть создан.

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

- An Abstract класс а Interface в Java используется для реализации поведения, которое постоянно меняется. Рассмотрим Abstract class like laying down some protocols for its concrete classes.

например:

public abstract class Vehicle{


}

public class Car extends Vehicle{

  public static void main(String[] args){

       Car car1 = new Car();         (Possible)
       Vehicle car2 = new Car();     (Possible)
       Vehicle car3 = new Vehicle();     (NOT Possible)

   }

}

абстрактные классы не могут быть созданы, они могут быть расширены. Массивы на самом деле являются объектами, вы просто говорите своему JVM : Эй, приятель, освободите место для 10 игровых объектов. Вот и все, вы не создаете никаких игровых объектов.


игры = новая игра(); Это создает экземпляр абстрактной игры класса, который не разрешен.

Создание массива со следующим Game[] gamesArray = новая игра[10];

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

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

спасибо

Тедж Киран


абстрактный класс, как следует из названия, не может быть создан. Когда вы сделали Game[] gamesArray = new Game[10]; Он создает array который может содержать Game references. Давайте попробуем соотнести это с реальным жизненным сценарием.

скажем, у вас есть абстрактный класс Animal. Вы не можете создать экземпляр, так как животное не является конкретным классом, поэтому Animal obj = new Animal() потерпит неудачу. Но!--5--> создаст массив, который может содержать ссылки на 10 объектов типа животных, таких как собака, кошка, лошадь и так далее.


абстрактные классы не имеют методов полностью конкретизированы. Они используются в качестве базовых классов, которые будут расширяться другими классами, "наследующими" их.

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

   public abstract class Pet{
        private String name;
        public void setName(String name){
             this.name = name;
        }
        public String getName(){
             return this.name;
        }
        abstract String makeNoise();
   }

это может быть расширено унаследованными классами:

    public class Cat extends Pet {
         public Cat(){ ... }
         ...
         public String makeNoise(){
              return "Meow!";
         }
    }
    ...
    public class Dog extends Pet {
         public Cat(){ ... }
         ...
         public String makeNoise(){
              return "Bark!";
         }
    }

оттуда вы можете иметь вещи в своем коде, такие как:

    Pet thisPet = new Dog();
    ...
    thisPet = new Cat();

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

    Pet petArr[] = new Pet[2];
    petArr[0] = new Cat();
    petArr[1] = new Dog();

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