2013-10-11 88 views
8

爲什麼我不能實例化一個抽象類,而是創建一個抽象類的數組?抽象類數組

public abstract class Game{ 
    ... 
} 

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

因爲您可以將所有'Game'的子類型放到數組中,但抽象類可能不會被實例化,因爲它是「不完整的」。 – Matthias

回答

11
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. 

這是非常允許的,這就是爲什麼你會爲第一個地方一個抽象類中去英寸

+1

啊..謝謝。它是聲明與實例化。 – Nitin

+1

不是@Nitin,它不是關於聲明和實例化。編寫'新遊戲[10]'實例化一個數組 - 它只是沒有實例化任何遊戲。 _declaration_部分是你寫'Game [] gamesArray'的地方,它聲明瞭一個類型爲「數組遊戲」的變量。 –

+0

@DavidWallace明白了。謝謝你清理那個。 – Nitin

2

因爲當你製作一些對象類型的數組時,你並不試圖實例化對象。您正在製作的是插入參考的多個插槽。

new Game[10];Game引用提供了10個插槽,但它並不構成單個Game

1

抽象類不能被實例化,它們可以被擴展。實際上,數組實際上就是對象,你只需要對你的JVM說:嘿夥計,爲10個遊戲對象騰出空間。就是這樣,你不會實例化任何Game對象。

2

因爲你不違反abstract class rules.Essentially,

Game games = new Game(); 

被分解爲:

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

在創建對象是完全有效的抽象類,初始化是不允許的。

1

遊戲遊戲=新遊戲(); 這是創建不被允許的抽象類遊戲的實例。

用以下創建數組 Game [] gamesArray = new Game [10];

就像是在聲明遊戲對象,它不創建實例。 喜歡遊戲遊戲;

要麼你聲明遊戲類的10個對象或遊戲的數組遊戲都是一樣的,只是內存分配會有所不同。

感謝

TEJ基蘭

1

抽象類的名字所暗示的不能被實例化。當你做了Game[] gamesArray = new Game[10];它創建了一個array,它可以容納Game references。讓我們嘗試將它與現實生活場景聯繫起來。

假設您有一個抽象類Animal。你不能實例化它,因爲動物不是一個具體的類,所以Animal obj = new Animal()會失敗。但是Animal[] animalArray = new Animal[10]會創建一個數組,它可以保存對狗,貓,馬等10種動物類型對象的引用。

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) 

    } 

} 
+0

'汽車2 =新車(); (可能) 汽車3 =新車(); (不可能)'這兩個陳述有什麼不同? – Prateek

+0

@Prateek ...對不起親愛的..這是一個錯誤的從我身邊..我已經糾正它...感謝檢測錯字 –

+0

現在你得到它的權利:)一秒鐘,你讓我思考 – Prateek

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

您可以創建寵物的陣列,其中將貓和狗都視爲可接受的元素。

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

欲瞭解更多信息,我建議你看一下覆蓋抽象類here的Java教程部分。