2013-10-11 21 views
8

Perché non è possibile creare un'istanza di una classe astratta ma creare una matrice della classe astratta?Matrice di classe astratta

public abstract class Game{ 
    ... 
} 

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

Perché è possibile inserire tutti i sottotipi di 'Gioco' nell'array, ma una classe astratta non può essere istanziata in quanto è" incompleta ". – Matthias

risposta

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

Instantiation significa creazione di un'istanza di una classe. Nello scenario sopra, hai appena dichiarato un gamesArray di tipo Game con la dimensione 10 (solo i riferimenti e nient'altro). Ecco perché non lancia alcun errore.

Si otterrà l'errore quando si tenta di fare

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

ma creare un array di classe astratta?

In seguito, si può fare qualcosa di simile

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

Questo è molto permesso e questo è il motivo per cui andrete a una classe astratta sul primo posto.

+1

Ahh..grazie. È dichiarazione contro istanziazione. – Nitin

+1

No @Nitin, non si tratta in realtà di dichiarazione o istanza. Scrivere 'new Game [10]' istanzia un array - non crea un'istanza di alcun gioco. La parte _declaration_ è dove hai scritto 'Game [] gamesArray', che dichiara una variabile di tipo" array of Games ". –

+0

@DavidWallace Capito. Grazie per averlo chiarito. – Nitin

2

Perché quando si crea un array di un tipo di oggetto, non si sta tentando di creare un'istanza degli oggetti. Tutto quello che stai facendo è un numero di slot di mettere i riferimenti in.

new Game[10]; fa 10 slot per Game riferimenti, ma non fa un solo Game.

1

Le classi astratte non possono essere istanziate, possono essere estese. Gli array sono in realtà oggetti, devi solo dire alla tua JVM: hey amico, crea un po 'di spazio per 10 oggetti di gioco. Questo è tutto, non istanziate alcun oggetto di gioco.

2

Perché non violare il abstract class rules.Essentially,

Game games = new Game(); 

è rotto verso il basso per:

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

Mentre la creazione di oggetti è perfettamente valida per le classi astratte, inizializzazione non è permesso.

1

Giochi di gioco = nuovo Gioco(); Questo sta creando un'istanza di Abstract Class Game che non è consentita.

Creazione di array con il seguente Game [] gamesArray = new Game [10];

è proprio come un oggetto di gioco che dichiara che non sta creando un'istanza. come il gioco del gioco;

O dichiari 10 oggetti della classe Game o l'array di gioco del cratere sono uguali, solo l'allocazione della memoria sarà diversa.

Grazie

Tej Kiran

1

classe astratta come suggerisce il nome non possono essere istanziati.Quando hai eseguito Game[] gamesArray = new Game[10];, viene creato uno che può contenere Game references. Cerchiamo di metterlo in relazione con uno scenario di vita reale.

Supponiamo di avere una classe astratta Animal. Non è possibile creare un'istanza come animale non è una classe concreta, quindi Animal obj = new Animal() non riuscirebbe. Ma Animal[] animalArray = new Animal[10] creerebbe un array che può contenere riferimenti a 10 oggetti di tipo animale come cane, gatto, cavallo e così via.

2

- Una classe Abstract è quello la cui esempio non può essere creata.

- Creazione di un array che contiene la variabile oggetto di riferimento di quella classe astratta sono solo i riferimenti non l'oggetto stesso.

- Una classe Abstract così come un Interface in Java viene utilizzato per comportamenti che continua a cambiare di attuazione. Si consideri il Abstract class like laying down some protocols for its concrete classes.

Esempio:

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

'Veicolo veicolo2 = auto nuova(); (Possibile) Veicolo car3 = auto nuova(); (NON possibile) 'Come sono diverse queste due affermazioni? – Prateek

+0

@Prateek ... scusa caro .. è stato un errore di battitura dal mio lato .. l'ho corretto ... grazie per aver rilevato l'errore di battitura –

+0

Ora hai capito bene :) Per un secondo mi hai fatto pensare – Prateek

0

classi astratte non hanno metodi del tutto specificati ulteriormente. Sono usati come classi base che sarebbero ulteriormente estese da altre classi che li "ereditano".

Ad esempio, è possibile avere una classe astratta denominata Animale domestico.

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

che può essere esteso per classi ereditate:

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

Da lì, si può avere le cose nel codice come ad esempio:

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

Ed è possibile creare array di animali che prenderebbe sia gatti che cani come elementi accettabili.

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

Per ulteriori informazioni, vi consiglio di guardare la sezione Java esercitazione copre classi astratte here.