/** Los métodos static y los campos no son polimórficos: cuenta el tipo estático. */
public class StaticDemo {

    static class Parent {
        String label = "campo de Parent";

        static String kind() {
            return "Parent.kind()";
        }

        String describe() {
            return "Parent.describe()";
        }
    }

    static class Child extends Parent {
        String label = "campo de Child";   // oculta (no es override) el de Parent

        static String kind() {             // oculta (no es override) el de Parent
            return "Child.kind()";
        }

        @Override
        String describe() {
            return "Child.describe()";
        }
    }

    // Llamamos a kind() a través de una variable a propósito, para mostrar
    // que se usa el tipo de la variable; javac avisa con [static].
    @SuppressWarnings("static")
    public static void main(String[] args) {
        Parent p = new Child();
        IO.println(p.describe());   // de instancia: decide el objeto
        IO.println(p.kind());       // static: decide el tipo de p
        IO.println(p.label);        // campo: decide el tipo de p
        IO.println(((Child) p).label);
    }
}
