15

为什么我不能实例化一个抽象类,而是创建一个抽象类的数组?

public abstract class Game{
  ...
}

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

8 回答 8

18
Game[] gamesArray = new Game[10];

实例化意味着创建一个类的实例。在上面的场景中,你刚刚声明了一个具有大小gamesArray的类型(只是引用,没有别的)。这就是为什么它没有抛出任何错误。Game10

当你尝试做时你会得到错误

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

但是制作一个抽象类的数组?

稍后,你可以做这样的事情

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

这是非常允许的,这就是为什么您首先要学习抽象类的原因。

于 2013-10-11T05:12:34.743 回答
2

因为当您创建某个对象类型的数组时,您并没有尝试实例化这些对象。您所做的只是一些用于放置参考的插槽。

new Game[10];Game引用创建了 10 个插槽,但它没有创建一个Game.

于 2013-10-11T05:11:34.680 回答
2

-Abstract类是不能创建其实例的类。

-创建一个包含该抽象类的对象引用变量的数组只是引用而不是对象本身

- Java 中的Abstract类和类Interface用于实现不断变化的行为。考虑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)

   }

}
于 2013-10-11T05:20:57.387 回答
2

因为你不违反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

虽然创建对象对抽象类完全有效,但不允许初始化。

于 2013-10-11T05:14:21.050 回答
1

顾名思义,抽象类不能被实例化。当您这样做时Game[] gamesArray = new Game[10];,它正在创建一个array可以容纳的Game references. 让我们尝试将其与现实生活场景联系起来。

假设您有一个抽象类Animal。你不能实例化它,因为动物不是一个具体的类,所以Animal obj = new Animal()会失败。但是Animal[] animalArray = new Animal[10]会创建一个数组,该数组可以保存对 10 种动物类型对象的引用,例如狗、猫、马等。

于 2013-10-11T05:17:26.150 回答
1

抽象类不能被实例化,它们可以被扩展。数组实际上是对象,您只需对您的 JVM 说:嘿,伙计,为 10 个游戏对象腾出一些空间。就是这样,您没有实例化任何 Game 对象。

于 2013-10-11T05:12:08.777 回答
1

游戏游戏 = 新游戏();这是创建不允许的抽象类游戏实例。

使用以下 Game[] gamesArray = new Game[10] 创建数组;

就像在这里声明游戏对象一样,它没有创建实例。喜欢游戏游戏;

要么你声明 10 个 Game 类的对象,要么声明游戏的 crating 数组都是相同的,只是内存分配不同。

谢谢

泰基兰

于 2013-10-11T05:14:48.800 回答
0

抽象类没有完全充实的方法。它们被用作基类,这些基类将被“继承”它们的其他类进一步扩展。

例如,您可以有一个名为 Pet 的抽象类。

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

您可以创建 Pets 数组,将 Cats 和 Dogs 作为可接受的元素。

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

有关更多信息,我建议您在此处查看涵盖抽象类的 java 教程部分。

于 2013-10-11T05:28:08.680 回答