2013-04-07 26 views
33

Mi sono imbattuto in questo blocco di codice, e c'è questa riga che non smetto di capire il significato o cosa sta facendo.Che cosa significa "questo()" metodo?

public Digraph(In in) { 
    this(in.readInt()); 
    int E = in.readInt(); 
    for (int i = 0; i < E; i++) { 
     int v = in.readInt(); 
     int w = in.readInt(); 
     addEdge(v, w); 
    } 
} 

capisco cosa o this.variable sono, ma ciò che è this()?

+0

@Avi Stavo giusto pensando questo suonava familiare. –

risposta

48

Questo è costruttore di sovraccarico:

public class Diagraph { 

    public Diagraph(int n) { 
     // Constructor code 
    } 


    public Digraph(In in) { 
     this(in.readInt()); // Calls the constructor above. 
     int E = in.readInt(); 
     for (int i = 0; i < E; i++) { 
     int v = in.readInt(); 
     int w = in.readInt(); 
     addEdge(v, w); 
     } 
    } 
} 

Si può dire questo codice è un costruttore e non un metodo per la mancanza di un tipo di ritorno. Questo è molto simile a chiamare super() nella prima riga del costruttore per inizializzare la classe estesa. Dovresti chiamare this() (o qualsiasi altro sovraccarico di this()) nella prima riga del tuo costruttore e quindi evitare duplicazioni del codice costruttore.

si può anche avere uno sguardo a questo post: Constructor overloading in Java - best practice

+0

Grazie mille ... Bella informazione – Gattsu

10

L'utilizzo di questo() come una funzione del genere, chiama essenzialmente il Costruttore della classe. Ciò consente di tutte le inizializzazioni generiche in un costruttore e di avere specializzazioni in altri. Quindi, in questo esempio di codice, la chiamata a this(in.readInt()) sta chiamando il costruttore Digraph che ha un argomento int.

3

Un altro costruttore della classe Digraph con un parametro int.

Digraph(int param) { /* */ } 
8

Questo snippet di codice è un costruttore.

Questa chiamata a this chiama un altro costruttore della stessa classe

public App(int input) { 
} 

public App(String input) { 
    this(Integer.parseInt(input)); 
} 

Nell'esempio sopra abbiamo un costruttore che prende un int e uno che prende un String. Il costruttore che prende uno String converte lo String in uno int e quindi lo delega al costruttore int.

Si noti che una chiamata a un altro costruttore o un costruttore di superclasse (super()) deve essere la prima riga in un costruttore.

Forse dare un'occhiata a this per una spiegazione più dettagliata del sovraccarico del costruttore.

3

Calling this essenzialmente chiama la classe Constructor. Per esempio, se si sta estendendo qualcosa, che insieme a add(JComponent), si potrebbe fare: this.add(JComponent).

2

Costruttore Sovraccarico:

es:

public class Test{ 

    Test(){ 
     this(10); // calling constructor with one parameter 
     System.out.println("This is Default Constructor"); 
    } 

    Test(int number1){ 
     this(10,20); // calling constructor with two parameter 
     System.out.println("This is Parametrized Constructor with one argument "+number1); 
    } 

    Test(int number1,int number2){ 
     System.out.println("This is Parametrized Constructor with two argument"+number1+" , "+number2); 
    } 


    public static void main(String args[]){ 
     Test t = new Test(); 
     // first default constructor,then constructor with 1 parameter , then constructor with 2 parameters will be called 
    } 

} 
2

this(); è il costruttore che viene utilizzato per chiamare un altro costruttore in una classe, ad esempio: -

class A{ 
    public A(int,int) 
    { this(1.3,2.7);-->this will call default constructor 
    //code 
    } 
public A() 
    { 
    //code 
    } 
public A(float,float) 
    { this();-->this will call default type constructor 
    //code 
    } 
} 

Nota: non ho utilizzato il costruttore this() nel costruttore predefinito perché porterà allo stato di deadlock.

Spero che questo vi aiuterà a :)

4

E 'quasi la stessa

public class Test { 
    public Test(int i) { /*construct*/ } 

    public Test(int i, String s){ this(i); /*construct*/ } 

} 
+0

I tuoi commenti stanno rovinando le parentesi di chiusura –

+0

@Alex Questo perché li ho copiati dall'OP per chiarezza. – Antimony