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];

インスタンス化とは、クラスのインスタンスの作成を意味します。上記のシナリオでは、サイズを指定してgamesArrayof 型を宣言しただけです(参照だけで他には何もありません)。そのため、エラーは発生しません。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];参照用に 10 個のスロットをGame作成しますが、単一のGame.

于 2013-10-11T05:11:34.680 に答える
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 に答える
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 に答える
1

抽象クラスはインスタンス化できず、拡張できます。配列は実際にはオブジェクトです。あなたは JVM にこう言うだけです。以上で、Game オブジェクトをインスタンス化することはありません。

于 2013-10-11T05:12:08.777 に答える
1

名前が示すように、抽象クラスはインスタンス化できません。あなたがしたとき、それはを保持できる をGame[] gamesArray = new Game[10];作成しています。それを実際のシナリオに関連付けてみましょう。arrayGame references

抽象クラスがあるとしますAnimal。animal は具体的なクラスではないため、インスタンス化できないため、Animal obj = new Animal()失敗します。ただしAnimal[] animalArray = new Animal[10]、犬、猫、馬などの 10 種類の動物型オブジェクトへの参照を保持できる配列を作成します。

于 2013-10-11T05:17:26.150 に答える
1

ゲーム ゲーム = 新しいゲーム(); これは、許可されていない抽象クラス ゲームのインスタンスを作成しています。

次の Game[] gamesArray = new Game[10]; で配列を作成します。

ここでゲームオブジェクトを宣言するのと同じように、インスタンスを作成していません。ゲームゲームのように;

Game クラスの 10 個のオブジェクトを宣言するか、ゲームのクレート配列を宣言するかはどちらも同じで、メモリの割り当てが異なるだけです。

ありがとう

テジ・キラン

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

また、Cats と Dogs の両方を受け入れ可能な要素として受け入れる Pets の配列を作成できます。

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

詳細については、ここで抽象クラスをカバーする Java チュートリアルのセクションを参照することをお勧めします。

于 2013-10-11T05:28:08.680 に答える