Capire i costruttori

Dire che un costruttore è un metodo è come dire che l'ornitorinco australiano è solo un altro mammifero. Per capire l'ornitorinco, è importante sapere come è diverso dagli altri mammiferi. Per comprendere il costruttore, è altrettanto importante capire come differisce da un metodo. Ogni studente di Java, specialmente uno che studia per la certificazione, deve conoscere queste differenze; in questo articolo le spiegherò concretamente. La tabella 1, alla fine di questo articolo, riassume le principali distinzioni costruttore / metodo.

Scopo e funzione

I costruttori hanno uno scopo nella vita: creare un'istanza di una classe. Questo può anche essere chiamato creazione di un oggetto, come in:

Ornitorinco p1 = nuovo Ornitorinco (); 

Lo scopo dei metodi, al contrario, è molto più generale. La funzione di base di un metodo è eseguire il codice Java.

Differenze di firma

Costruttori e metodi differiscono in tre aspetti della firma: modificatori, tipo restituito e nome. Come i metodi, i costruttori possono avere uno qualsiasi dei modificatori di accesso: pubblico, protetto, privato o nessuno (spesso chiamato pacchetto o amichevole ). A differenza dei metodi, i costruttori possono accettare solo modificatori di accesso. Pertanto, i costruttori non possono essere abstract, final, native, static, o synchronized.

Anche i tipi di reso sono molto diversi. I metodi possono avere qualsiasi tipo restituito valido o nessun tipo restituito, nel qual caso il tipo restituito viene fornito come void. I costruttori non hanno alcun tipo di ritorno, nemmeno void.

Infine, in termini di firma, metodi e costruttori hanno nomi diversi. I costruttori hanno lo stesso nome della loro classe; per convenzione, i metodi usano nomi diversi dal nome della classe. Se il programma Java segue le normali convenzioni, i metodi inizieranno con una lettera minuscola, i costruttori con una lettera maiuscola. Inoltre, i nomi dei costruttori sono solitamente sostantivi perché i nomi delle classi sono solitamente sostantivi; i nomi dei metodi di solito indicano azioni.

L'uso di "questo"

Costruttori e metodi utilizzano la parola chiave in modo thisabbastanza diverso. Un metodo utilizza thisper fare riferimento all'istanza della classe che sta eseguendo il metodo. I metodi statici non vengono utilizzati this; non appartengono a un'istanza di classe, quindi non thisavrebbero nulla a cui fare riferimento. I metodi statici appartengono alla classe nel suo insieme, piuttosto che a un'istanza. I costruttori usano thisper fare riferimento a un altro costruttore nella stessa classe con un diverso elenco di parametri. Studia il codice seguente:

public class Platypus {String name; Platypus (String input) {name = input; } Ornitorinco () {questo ("John / Mary Doe"); } public static void main (String args []) {Platypus p1 = new Platypus ("digger"); Ornitorinco p2 = nuovo Ornitorinco (); }}

Nel codice sono presenti due costruttori. Il primo richiede un Stringinput per denominare l'istanza. Il secondo, senza prendere parametri, chiama il primo costruttore con il nome predefinito "John/Mary Doe".

Se un costruttore usa this, deve essere nella prima riga del costruttore; ignorando questa regola, il compilatore si opporrà.

L'uso di "super"

Metodi e costruttori usano entrambi superper riferirsi a una superclasse, ma in modi diversi. I metodi vengono utilizzati superper eseguire un metodo sovrascritto nella superclasse, come illustrato nell'esempio seguente:

class Mammal {void getBirthInfo () {System.out.println ("nato vivo."); }} la classe Platypus estende Mammal {void getBirthInfo () {System.out.println ("hatch from eggs"); System.out.print ("un mammifero normalmente è"); super.getBirthInfo (); }}

Nel programma precedente, la chiamata a super.getBirthInfo()chiama il metodo sovrascritto della Mammalsuperclasse.

I costruttori usano superper invocare il costruttore della superclasse. Se un costruttore usa super, deve usarlo nella prima riga; altrimenti, il compilatore si lamenterà. Segue un esempio:

public class SuperClassDemo {SuperClassDemo () {}} class Child estende SuperClassDemo {Child () {super (); }}

Nell'esempio precedente (e banale!), Il costruttore Child()include una chiamata a super, che causa l' SuperClassDemoistanza della classe , oltre alla Childclasse.

Codice fornito dal compilatore

Il nuovo programmatore Java potrebbe inciampare quando il compilatore fornisce automaticamente il codice per i costruttori. Questo accade se scrivi una classe senza costruttori; il compilatore fornirà automaticamente un costruttore senza argomenti. Quindi, se scrivi:

esempio di classe pubblica {} 

è funzionalmente equivalente alla scrittura:

esempio di classe pubblica {Example () {}} 

Il compilatore fornisce automaticamente il codice anche quando non si utilizza super(utilizzando zero o più parametri) come prima riga di un costruttore. In questo caso, il computer inserisce automaticamente super. Quindi, se scrivi:

classe pubblica TestConstructors {TestConstructors () {}} 

è funzionalmente equivalente alla scrittura:

classe pubblica TestConstructors {TestConstructors () { super; }}

Il principiante acuto potrebbe chiedersi come il programma precedente possa chiamare il costruttore della classe genitore quando TestConstructornon sta estendendo nessuna classe. La risposta è che Java estende la Objectclasse quando non estendi esplicitamente una classe. Il compilatore fornisce automaticamente un costruttore senza argomenti se nessun costruttore è dichiarato esplicitamente e fornisce automaticamente una superchiamata senza argomenti quando un costruttore non ha una chiamata esplicita a super. Quindi i seguenti due frammenti di codice sono funzionalmente equivalenti:

esempio di classe pubblica {} 

e

public class Esempio {Example () { super; }}

Eredità

Cosa c'è di sbagliato nel seguente scenario? Un avvocato sta leggendo il testamento di A. Class. I membri della Classfamiglia sono riuniti attorno a un grande tavolo da conferenza, alcuni singhiozzando dolcemente. L'avvocato legge: "Io, A. Classessendo sano di mente e di corpo, lascio tutti i miei costruttori ai miei figli".

Il problema è che i costruttori non possono essere ereditati. Fortunatamente per i Classbambini, erediteranno automaticamente tutti i metodi dei loro genitori, quindi i Classbambini non diventeranno completamente indigenti.

Ricorda, i metodi Java vengono ereditati, i costruttori no. Considera la seguente classe:

public class Esempio {public void sayHi {system.out.println ("Hi"); } Esempio () {}} public class SubClass extends Example {}

The SubClass class automatically inherits the sayHi method found in the parent class. However, the constructor Example() is not inherited by the SubClass.

Summarizing the differences

Just as the platypus differs from the typical mammal, so too do constructors differ from methods; specifically in their purpose, signature, and use of this and super. Additionally, constructors differ with respect to inheritance and compiler-supplied code. Keeping all these details straight can be a chore; the following table provides a convenient summary of the salient points. You can find more information regarding constructors and methods in the Resources section below.

Table 1. Differences Between Constructors and Methods

Topic Constructors Methods
Purpose Create an instance of a class Group Java statements
Modifiers Cannot be abstract, final, native, static, or synchronized Can be abstract, final, native, static, or synchronized
Return type No return type, not even void void or a valid return type
Name Same name as the class (first letter is capitalized by convention) -- usually a noun Any name except the class. Method names begin with a lowercase letter by convention -- usually the name of an action
this Refers to another constructor in the same class. If used, it must be the first line of the constructor Refers to an instance of the owning class. Cannot be used by static methods
super Calls the constructor of the parent class. If used, must be the first line of the constructor Calls an overridden method in the parent class
Inheritance Constructors are not inherited Methods are inherited
Compiler automatically supplies a default constructor Se la classe non ha un costruttore, viene fornito automaticamente un costruttore senza argomenti Non si applica
Il compilatore fornisce automaticamente una chiamata predefinita al costruttore della superclasse Se il costruttore non effettua chiamate a zero o più argomenti super, superviene eseguita una chiamata senza argomenti a Non si applica
Robert Nielsen è un programmatore Java 2 certificato Sun. Ha conseguito un master in pedagogia, specializzato in istruzione assistita dal computer, e ha insegnato nel campo dei computer per diversi anni. Ha anche pubblicato articoli relativi al computer in una varietà di riviste.

Ulteriori informazioni su questo argomento

  • Alcuni libri che trattano le basi di costruttori e metodi sono
  • The Complete Java 2 Study Certification Guide, Simon Roberts et al. (Sybex, 2000) //www.amazon.com/exec/obidos/ASIN/0782128254/qid=969399182/sr=1-2/102-9220485-9634548
  • Java 2 (Exam Cram), Bill Brogden (The Coriolis Group, 1999):

    //www.amazon.com/exec/obidos/ASIN/1576102912/qid%3D969399279/102-9220485-9634548

  • Java in a Nutshell, Davis Flanagan (O'Reilly & Associates, 1999) // www.amazon.com/exec/obidos/ASIN/1565924878/o/qid=969399378/sr=2-1/102-9220485-9634548
  • Visitare il sito Web Sun Microsystems per una maggiore copertura di metodi e costruttori

    //java.sun.com/docs/books/tutorial/trailmap.html

  • Per ulteriori contenuti Java per principianti, leggi la nuova serie di colonne JavaWorld di Java 101

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

Questa storia, "Comprensione dei costruttori" è stata originariamente pubblicata da JavaWorld.