Pregunta

A continuación se presenta una parte de mi código para un proyecto:

public class Body extends Point{
    public double x, y, mass;

    public Body() {
        x = y = mass = 0;
    }

    public Body(double x, double y, double mass) {
        this.mass = mass;
        this.x = x;
        this.y = y;
    }
}

public class Point {
    public double x;
    public double y;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }
}

rápidamente me di cuenta de que haciendo esto creará dos variables dentro de la clase de cuerpo llamada x y otras dos variables en el cuerpo llamados y. ¿Cómo es esto posible, y por qué en la tierra qué Java incluso permiten que?

Asumo que esto es el código correcto del cuerpo de la clase:

public class Body extends Point{
    public double mass;

    public Body() {
        super();
        mass = 0;
    }

    public Body(double x, double y, double mass) {
        super(x,y);
        this.mass = mass;
    }
}

Gracias por su tiempo

¿Fue útil?

Solución

En un sentido, está sustituyendo los campos de la superclase. Pero es mucho más fácil de hacer por accidente, porque no hay sobrecarga de los campos (que sólo tiene una variable de un nombre de pila, el tipo no importa). Esto se conoce como variable 'ocultar' o 'sombra'. Por lo tanto, estás en lo correcto, que va a terminar con dos campos con el mismo nombre.

Su segundo ejemplo es la correcta. Ellos se heredan de la superclase y puesto que no se declaran privada, que sean visibles para la subclase. Por lo general es una mala práctica para referirse directamente a los campos de un super-clase, ya menos que haya una buena razón, que debe declararse privado. Su ejemplo de invocar el constructor de la superclase es el mejor enfoque.

Además, si oculta un campo con otro del mismo nombre, puede todavía se refieren a ellos como super.x, super.y, frente a this.x, this.y, se debe evitar esta situación en todo caso posible.

Otros consejos

Sí, usted tiene dos variables, con una ocultación de la otra. Tiene sentido para permitir que por dos razones:

  1. Supongamos que tienes un Base clase base y una clase derivada Derived que el autor de Base tiene ni idea. En caso de que el autor de Base no ser capaz de añadir cualquier campo, sólo porque una clase derivada podría compartir los campos? O debería Derived detener la compilación cuando el cambio a Base no afecta realmente a la corrección?
  2. Sus campos se debe casi siempre ser privadas, momento en el que no importa si los nombres están duplicados o no - ni "lado" estará al tanto de las variables de la otra
  3. .

Además de lo que han dicho: ¿Es un Body Point? No, Body tiene una propiedad de posición de tipo Point. Así Body probablemente no debería extenderse Point. Si a deshacerse de la herencia (de aplicación) y luego a deshacerse de una gran cantidad de problemas. Eso y el uso private (no protected!) Y final liberalmente.

  

rápidamente me di cuenta de que haciendo esto creará dos variables dentro de la clase de cuerpo llamada x y otras dos variables en el cuerpo llamados y. ¿Cómo es esto posible, y por qué en la tierra qué Java incluso permiten que?

En realidad no, usted no está creando dos variables con el mismo nombre, obviamente, un compilador no debe y no permitiría esto.

Lo que son está haciendo sombra las variables existentes definidos como x y y, lo que significa que Body.x y Body.y se solapan esencialmente los nombres para punto.x y Punto.y, haciendo que el este último dos variables completamente inaccesible desde la clase de cuerpo ( enlace a Java Language Specification definición de "sombra" ).

Nombre sombreado generalmente se percibe como una mala práctica y una causa de errores, y si sube las advertencias del compilador javac, el compilador diligentemente le advertirá sobre esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top