Los setters no funcionan

public class Shape{

    public int xPos = 10;
    public int yPos = 20;

    Shape(){

    }

    public int getXpos(){
        return xPos;
    }

    public void setXpos(int x){
        this.xPos = x;
    }

    public int getYpos(){
        return yPos;
    }

    public void setYpos(int y){
        this.yPos = y;
    }

}

public class Shape1 extends Shape{

    Shape1(){
        xPos = 100;
        yPos = 200;
    }

}

public class Test{

    public static void main(String[] args) {
        Shape1 shape1 = new Shape1();

        System.out.println(shape1.getXpos());
    }

}

¿Por qué obtengo 10 como resultado en lugar de 100?

preguntado el 03 de mayo de 12 a las 17:05

Esto ni siquiera es Java válido. Muéstranos el real código que está ejecutando. -

¿Es una tarea para casa? Parece gustarle. Debe estar marcado como uno. -

No, solo estoy haciendo mi propio programa. -

¿Estás seguro de que ese es todo tu código? -

En realidad, no puedo reproducir, funciona bien para mí, con una salida de 100. -

1 Respuestas

Ahora mi pregunta es: ¿Por qué obtengo 10 como resultado en lugar de 100?

El código tal como se presenta imprime 100. La explicación más probable es que no está ejecutando el código que dice que está ejecutando. Esto podría suceder debido a errores de copiar y pegar, problemas de implementación, etc.

Una forma poco conocida pero desagradable en la que su código podría modificarse sutilmente para imprimir 10 es agregando void en frente de Shape1constructor de:

void Shape1() {
    xPos = 100;
    yPos = 200;
}

Esto transforma Shape1() de un constructor a un método normal (que no se llama automáticamente durante la construcción del objeto).

Mi compilador acepta esta modificación y el código se imprime 10 cuando lo ejecuto.

De hecho, una vez tuve que lidiar con un error real causado por esto. Me tomó un poco de tiempo detectarlo, te lo aseguro.

contestado el 03 de mayo de 12 a las 18:05

void Shape1 () - ¿por qué cambia el constructor al método? haga público Shape1() en lugar de anular Shape1(). - Subhrajyoti Majumder

@Quoi: ¿Realmente leíste la respuesta? Todo su punto es que el código, tal como fue escrito, es correcto ... pero ese ligero cambio haría que se rompiera de la manera que describe la pregunta. Significar algo más o menos lo mismo que eso es probablemente lo que está mal con el código original (pre-pregunta) en primer lugar. - chao

amigo y está bien, estoy de acuerdo con lo que se describe (+1). Pero la pregunta era ¿Por qué obtengo 10 como resultado en lugar de 100? probablemente él/ella quiere la explicación, creo/ - Subhrajyoti Majumder

@Quoi: Y la explicación está justo ahí en la respuesta. Si el constructor se convierte accidentalmente en un método (pegando void delante de él, por ejemplo), no se llamará durante la construcción, por lo que los campos no cambiarán de lo que la clase base estableció. - chao

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.