2011-01-10 10 views
9

Il seguente programma fornisce output comeConfusione nel costruttore Sovraccarico Esempio

I am Parameterized Ctor 
a = 0 
b = 0 

public class ParameterizedCtor { 

    private int a; 
    private int b; 

    public ParameterizedCtor() { 
     System.out.println("I am default Ctor"); 
     a =1; 
     b =1; 
    } 

    public ParameterizedCtor(int a, int b) { 
     System.out.println(" I am Parameterized Ctor"); 
     a=a; 
     b=b; 

    } 
    public void print() { 
     System.out.println(" a = "+a); 
     System.out.println(" b = "+b); 
    } 

    public static void main(String[] args) { 

     ParameterizedCtor c = new ParameterizedCtor(3, 1); 
     c.print(); 
    } 

} 

Qual è la ragione?

risposta

14

Le variabili private non inizializzate a e b sono impostate su zero per impostazione predefinita. E l'overloading c'tctor entra in place.ie, parameterCtor (int a, int b) sarà chiamato da main e le variabili locali a & b sono impostate su 3 e 1, ma le variabili di classe a e b sono ancora zero. Quindi, a = 0, b = 0 (il segno di default non verrà chiamato).

Per impostare la variabile di classe, utilizzare:

this.a = a; 
this.b = b; 
6

Hai bisogno di fare questo:

public ParameterizedCtor(int a, int b) { 
    System.out.println(" I am Parameterized Ctor"); 
    this.a=a; 
    this.b=b; 
} 

in caso contrario, si sta solo ri-assegnare i parametri a e b a se stessi.

3

questo si chiama variable shadowing e il valore di default di int è 0

renderlo come

public ParameterizedCtor(int a, int b) { 
     System.out.println(" I am Parameterized Ctor"); 
     this.a=a; 
     this.b=b; 
} 

anche Vedi

0

T il suo codice

a=a; 
b=b; 

sta assegnando il valore in 'a' al parametro 'a'. Quello che intendi è probabile che sia.

this.a=a; 
this.b=b; 

BTW: Questo mostra come avvertimento nel mio IDE.

0

si ha una variabile locale chiamata a e una variabile membro denominata a, quindi è necessario utilizzare this.a per fare riferimento alla variabile membro, come a si riferisce alla variabile locale.

Potrebbe essere una buona idea rinominare la variabile locale in modo che non sia la stessa della variabile membro.

1

uso

this.a = a; 
this.b = b; 

anziché

a = a; 
b = b; 
1

uso

this.a = a; 
this.b = b; 

anziché

a = a; 
b = b; 
0
public class thisDemo { 
    public int x=1; 
    public int y=2; 

    String[] l=new String[1];String[] m=new String[1];String[] n=new String[1]; 

    public thisDemo(int a,int b) 
      { 
       this.x=14; 
       this.y=4; 
      } 
    public thisDemo(String a[],String b[],String c[]) 
    { 
     this.l[0]=a[0]; 
     this.m[0]=b[0]; 
     this.n[0]=c[0]; 
    } 
    public thisDemo() 
    { 

    } 
    public static void main(String[] args) 
    { 
     thisDemo thi=new thisDemo(2, 3); 
     System.out.println(thi.getClass()); 
     System.out.println(thi.x+" "+thi.y); 

     thisDemo td=new thisDemo(); 
     System.out.println(td.getClass()); 
     System.out.println("x="+td.x+"y="+td.y); 

     String xA[]={"a"}; 
     String yA[]={"b"}; 
     String zA[]={"c"}; 
     thisDemo tsd=new thisDemo(xA,yA,zA); 
     System.out.println(tsd.getClass()); 
     System.out.println(tsd.l[0]+" "+tsd.m[0]+" "+tsd.n[0]); 
    } 

} 
Problemi correlati