2011-01-10 6 views
9

El siguiente programa da salida comoConfusión en el constructor sobrecarga Ejemplo

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(); 
    } 

} 

Cuál es la razón?

Respuesta

14

Las variables privadas no inicializadas a y b se establecen en cero de forma predeterminada. Y el controlador de sobrecarga entra en funcionamiento. Se llamará parameterCtor (int a, int b) desde main y las variables locales a & b se establecen en 3 y 1, pero las variables de clase a y b siguen siendo cero. Por lo tanto, a = 0, b = 0 (no se llamará al c'tor predeterminado).

Para establecer la variable de clase, utilice:

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

que tiene que hacer esto:

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

lo contrario, estas a volver a asignar los parámetros a y b a sí mismos.

3

esto se llama variable shadowing y el valor por defecto de int es 0

que sea como

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

Vea también

0

T su código

a=a; 
b=b; 

está asignando el valor en 'a' al parámetro 'a'. Lo que pretendiste es probable que sea.

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

BTW: Esto se muestra como advertencia en mi IDE.

0

tiene una variable local llamada a y una variable miembro llamada a, por lo que es necesario utilizar this.a para referirse a la variable miembro, como a se refiere a la variable local.

Puede ser una mejor idea cambiar el nombre de la variable local para que no sea la misma que la variable miembro.

1

uso

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

en lugar de

a = a; 
b = b; 
1

uso

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

en lugar de

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]); 
    } 

} 
Cuestiones relacionadas