A continuación vamos a realizar un pequeño estudio, acerca de dos cosas, la primera de ellas es probar que pasa cuando ponemos los keywords, final y static al mismo tiempo en una clase, la segunda es determinar el comportamiento de las clases cuando se sobre escribe un método estático.
1) Tomando en cuenta que una clase final no puede ser extendida y una clase abstract debe ser extendida, cuando intentamos hacer:
public final abstract class ImposibleAbstractClass {
public abstract void doSomething ();
}
El compilador nos muestra el siguiente error de compilación:
"The class ImposibleAbstractClass can be either abstract or final, not both"
Osea, no se puede hacer.
2) Que pasa cuando sobre cargamos un método estático:
Veamos el siguiente código:
public class A {
public static void a () {
System.out.println("A");
}
public void b () {
System.out.println("a");
}
}
public class B extends A {
public static void a () {
System.out.println("B");
}
@Override
public void b() {
System.out.println("b");
}
}
public class Main {
@SuppressWarnings("static-access")
public static void main(String[] args) {
A a = new A ();
A b = new B ();
a.a(); // funciona x tipo
b.a();
System.out.println("***********");
a.b(); // funciona x polimorfismo, osea por implementación.
b.b();
System.out.println("***********");
A.a(); // Llamado directo a la clase, no hay quite.
B.a();
}
}
Resultado:
A
A
***********
a
b
***********
A
B
Como pueden ver y a diferencia del comportamiento polimorfico, la implementación del método la otorga el tipo y no la implementación.
Si cambiamos;
A a = new A ();
A b = new B ();
Por
A a = new A ();
B b = new B ();
El resultado cambia a:
A
B
Por que el tipo de la variable "b" paso de A a B, y por esta razón utiliza esta sobrecarga.
1) Tomando en cuenta que una clase final no puede ser extendida y una clase abstract debe ser extendida, cuando intentamos hacer:
public final abstract class ImposibleAbstractClass {
public abstract void doSomething ();
}
El compilador nos muestra el siguiente error de compilación:
"The class ImposibleAbstractClass can be either abstract or final, not both"
Osea, no se puede hacer.
2) Que pasa cuando sobre cargamos un método estático:
Veamos el siguiente código:
public class A {
public static void a () {
System.out.println("A");
}
public void b () {
System.out.println("a");
}
}
public class B extends A {
public static void a () {
System.out.println("B");
}
@Override
public void b() {
System.out.println("b");
}
}
public class Main {
@SuppressWarnings("static-access")
public static void main(String[] args) {
A a = new A ();
A b = new B ();
a.a(); // funciona x tipo
b.a();
System.out.println("***********");
a.b(); // funciona x polimorfismo, osea por implementación.
b.b();
System.out.println("***********");
A.a(); // Llamado directo a la clase, no hay quite.
B.a();
}
}
Resultado:
A
A
***********
a
b
***********
A
B
Como pueden ver y a diferencia del comportamiento polimorfico, la implementación del método la otorga el tipo y no la implementación.
Si cambiamos;
A a = new A ();
A b = new B ();
Por
A a = new A ();
B b = new B ();
El resultado cambia a:
A
B
Por que el tipo de la variable "b" paso de A a B, y por esta razón utiliza esta sobrecarga.
Comentarios
Este tambien habla de lo mismo, e indica que esa caracteristica se llama hiding.
Interesante el blog jsanca, keep going !!!
Miclase.miMetodoStatic();
Pura vida.