2012-11-01 10 views
5

Il modo in cui il mio insegnante scrive e organizza il codice è molto diverso da quello che viene proposto nel mio libro di testo supplementare. In un laboratorio recente, ci è stato richiesto di utilizzare la libreria wheels per visualizzare diversi oggetti in una singola finestra. Qui è la classe Snowman che è stato scritto dal mio maestro (codice per le altre voci non sono state incluse per comodità):Qual è l'uso corretto di un costruttore durante l'istanziazione nella classe principale?

public class Snowman { 
    private Ellipse _top; 
    private Ellipse _middle; 
    private Ellipse _bottom; 

public Snowman() { 
     _top = new Ellipse(); 
     _top.setColor(Color.WHITE); 
     _top.setFrameColor(Color.BLACK); 
     _top.setFrameThickness(1); 
     _top.setSize(80, 80); 
     _middle = new Ellipse(); 
     _middle.setColor(Color.WHITE); 
     _middle.setFrameColor(Color.BLACK); 
     _middle.setFrameThickness(1); 
     _middle.setSize(120, 120); 
     _bottom = new Ellipse(); 
     _bottom.setColor(Color.WHITE); 
     _bottom.setFrameColor(Color.BLACK); 
     _bottom.setFrameThickness(1); 
     _bottom.setSize(160, 160); 
    } 
    public void setLocation(int x, int y) { 
     _top.setLocation(x + 40, y - 170); 
     _middle.setLocation(x + 20, y - 100); 
     _bottom.setLocation(x, y); 
    } 
}  

Questo oggetto, tra l'altro, viene poi creata un'istanza della classe SnowmanCartoon:

public class SnowmanCartoon extends Frame{ 
    private Snowman _snowman; 
    private Eyes _eyes; 
    private Hat _hat; 
    private Bubble _bubble; 

    public SnowmanCartoon() { 
     _snowman = new Snowman(); 
     _snowman.setLocation(100, 300); 
     _eyes = new Eyes(); 
     _eyes.setLocation(165, 150);   
     _hat = new Hat(); 
     _hat.setLocation(152, 98); 
     _bubble = new Bubble(); 
     _bubble.setLocation(280, 60); 
    } 
    public static void main(String[] args) { 
     new SnowmanCartoon(); 
    } 
} 

Qui sono le mie preoccupazioni:

  1. In entrambi queste classi, perché esiste un metodo con lo stesso nome della classe e qual è il suo scopo?

  2. Perché è il metodo setLocation() un metodo vuoto mentre il metodo Snowman() non è, anche se Snowman() non restituisce nulla?

  3. Nella classe SnowmanCartoon, quando dice private Snowman _snowman; e _snowman = new Snowman();, è Snowman riferimento alla classe Snowman, o meglio il metodo Snowman()?

  4. Se l'istanza dell'oggetto Snowman si riferisce al metodo Snowman() per impostare tutte le sue proprietà, perché non ho bisogno di usare l'operatore punto: Snowman.Snowman()?

  5. Nel mio libro di testo, variabili e metodi di istanza sono dichiarati in una classe e sono istanziati in un'altra. Tuttavia, sembrano verificarsi simultaneamente nel codice del mio insegnante.

+11

Alcune volte quando devi leggere devi leggere. –

+1

Non so perché la gente ti abbia votato per non aver capito un costruttore. Ti stai sforzando di imparare e questo a mio parere è molto meglio di quelli che pubblicano solo le risposte. – WilliamShatner

risposta

8

Il metodo denominato come classe è denominato "costruttore" della classe. È usato per istanziare un oggetto.

Esempio:

public class MyClass { // class 
    public MyClass() { // constructor 

    } 
} 

noti che costruttore è come qualsiasi altro metodo, tuttavia, non ha un tipo restituito. In pratica restituisce "questo" oggetto.

Quando si chiama

MyClass a = new MyClass(); 

questo sarà effettivamente invocare il costruttore e creare l'oggetto.

Si noti che è possibile avere più costruttori in una classe utilizzando diversi numeri e tipi di parametri.

In java, se non si include alcun costruttore, qualsiasi classe avrà per impostazione predefinita il costruttore senza parametri predefinito.

public MyClass() { 
} 

Tonnellate di informazioni disponibili sui costruttori online. Sono i concetti base per iniziare a imparare la programmazione orientata agli oggetti. Altre informazioni here.

--EDIT-- rispondere alla domanda su come chiamare la domanda specifica.

Prendete questi due costruttori

public MyClass(){ 
// do things 
} 

public MyClass(String p){ 
// do things 
} 

Poi, quando si crea un'istanza di oggetto

MyClass c = new MyClass(); // use constructor 1 
MyClass d = new MyClass("value"); // use constructor 2 
+0

Nella classe' SnowmanCartoon', assumendo che avessi più costruttori nella classe 'Snowman', come utilizzerei un costruttore specifico rispetto a un altro? – Eunkai

+0

@AbdullahFahad È possibile chiamare un costruttore specifico specificando i parametri particolari con cui è stato definito il costruttore. vedi Modifica .. – rizalp1

6

public Snowman() {...} viene chiamato come costruttore. Questo sarà invocato mentre stai creando l'oggetto per questa classe. Se non si definisce un costruttore, jvm ne crea implicitamente uno. Leggere questo numero javadoc per ulteriori informazioni sui costruttori.

Snowman() non è un metodo, è un costruttore. costruttore non ha tipo di ritorno. Se aggiungi il tipo di reso, verrebbe considerato come metodo.

+0

questo è corretto: P –

+0

Questo chiarisce molte cose per me. Grazie! Potresti spiegare un po 'di più sui costruttori? Le definizioni formali che ho trovato non vengono intuitivamente per me. – Eunkai

+0

@AbdullahFahad: risposta aggiornata con una buona risorsa per comprendere i costruttori. – kosa

2

1 Non è un metodo, è un costruttore.

2 vuoto è solo un tipo di reso. vuoto significa che il metodo non restituisce nulla. E i costruttori non hanno ritorni.

3 Si riferisce al costruttore Snowman(). Non è un metodo. Crea un oggetto pupazzo di neve.

5 È possibile inserire l'istanza dell'oggetto pupazzo di neve in una classe diversa. Immagino che il tuo insegnante lo abbia messo nella stessa classe per semplicità.

6 Sto assumendo che JVM si prenda cura di esso.

3

Questo è chiamato constructor in Java. Questo metodo viene chiamato quando si esegue

Snowman s = new Snowman(); 
4

In entrambe le classi, perché c'è un "metodo" con lo stesso nome come la classe?

Questo tipo di metodo è chiamato costruttore. Se non accetta parametri, è conosciuto come "costruttore predefinito". Costruttori sono ciò che usi per costruire le tue istanze, es. Snowman s = new Snowman(); chiama il costruttore predefinito.

Perché il metodo setLocation un metodo vuoto, ma non uno Pupazzo di neve, anche se non restituisce nulla?

Perché i costruttori sono diversi dai metodi normali. Restituiscono un'istanza del loro oggetto, ovvero new Snowman() restituisce una nuova istanza di Snowman nel suo stato predefinito.

Nella classe principale di SnowmanCartoon, quando si dice privato Snowman _snowman; e _snowman = new Snowman(); si riferisce alla classe Snowman, o piuttosto al metodo Snowman()?

Se vedete mai new Snowman() (o qualsiasi equivalente), ciò si riferisce sempre al costruttore.

Poiché questo è il caso, perché non ho bisogno di correre Snowman.Snowman() per impostare tutte le proprietà, dal momento che è un metodo, e non public static void main ?

Quando si esegue il programma, non si eseguono le lezioni. Stai istanziando istanze dei tuoi oggetti da usare con altre operazioni. Dire Snowman s = new Snowman() ti lascia con un Snowman oggetto denominato s in modo che ora puoi fare cose con quell'oggetto.

In Head First Java, le variabili di istanza ei metodi sono dichiarati in una classe separata mentre vengono istanziati in una classe separata. Qui, questo sembra accadere allo stesso tempo, ma non capisco come.

Questa domanda non ha molto senso per me.

Nella classe principale, quando creo un nuovo SnowmanCartoon, perché non ho bisogno di fare qualcosa per lanciarlo, come creare la finestra, ecc?

Questo perché la classe si sta estendendo Frame. Frame include le operazioni predefinite utilizzate dalla classe base (SnowmanCartoon). Quindi in breve la tua super classe si prenderà cura di questo per te.

Spero che questo aiuti.

Problemi correlati