为什么我不能实例化一个抽象类,而是创建一个抽象类的数组?
public abstract class Game{
...
}
Game games = new Game(); //Error
Game[] gamesArray = new Game[10]; //No Error
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];
为Game
参考制作了10个插槽,但它没有制作单个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
虽然创建对象对抽象类完全有效,但不允许初始化。
- Abstract
类是不能创建其实例的类。
- 创建一个包含该Abstract类的Object Reference Variable的Array只是引用而不是对象本身。
- 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)
}
}
抽象类无法实例化,可以扩展。数组实际上是对象,你只需对你的JVM说:嘿好友,为10个Game对象腾出空间。就是这样,你不会实例化任何游戏对象。
游戏=新游戏();这是创建不允许的抽象类游戏的实例。
使用以下Game [] gamesArray = new Game [10]创建数组;
就像在这里声明游戏对象一样,它不是创建实例。喜欢游戏;
无论你宣称Game类的10个对象还是crating数组的游戏都是相同的,只是内存的分配会有所不同。
谢谢
夏普雷
抽象类名称暗示无法实例化。当你做Game[] gamesArray = new Game[10];
时,它正在创造一个可以容纳array
的Game references
。让我们尝试将它与现实生活场景联系起来。
假设你有一个抽象类Animal
。你无法实例化它,因为动物不是一个具体的类,所以Animal obj = new Animal()
会失败。但Animal[] animalArray = new Animal[10]
会创建一个数组,可以容纳10种动物类型的对象,如狗,猫,马等。
抽象类没有完全充实的方法。它们被用作基类,可以通过“继承”它们的其他类进一步扩展。
例如,您可以拥有一个名为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();
你可以创建宠物阵列,将猫和狗都作为可接受的元素。
Pet petArr[] = new Pet[2];
petArr[0] = new Cat();
petArr[1] = new Dog();
有关更多信息,我建议您查看涵盖抽象类here的java教程部分。