Hola, me surgió esta curiosidad cuando estaba mezclando los distintos tipos de modificadores que existen en Java y en un momento en que declaré una clase como abstract y final el compilador me marcaba un error. Yo sé que el modificador abstract permite que una clase no pueda ser instanciada y que el modificador final hace que una clase no pueda ser extendida, es decir, no pueda tener clases hijas. Pero no sé la razón por la cual no puede ser ambas a la vez? :rolleyes:
cielos discúlpame que sea troll pero si james goslin leyera tu post se tiraría de una ventana
mira abstract sirve para forsar a que tengas que heredar de esa clase . y final sirve para que no puedas herdar la clase :o
Yo me tiraría de una ventana también por tus faltas ortográficas sapito .
Cita de: sapito169 en 21 Octubre 2012, 04:42 AM
cielos discúlpame que sea troll pero si james goslin leyera tu post se tiraría de una ventana
mira abstract sirve para forsar a que tengas que heredar de esa clase . y final sirve para que no puedas herdar la clase :o
Si eso ya lo sé (por algo lo mencioné, yo sé para que sirve cada modificador). Pero yo tengo un ejemplo en el que no necesito hacer ninguna de ambas. En el caso en el que una clase tenga el método main, osea un java main class, este no necesita instanciarse (abstract) y tampoco necesita heredarse (final).
Creo que el hecho que una clase sea abstract no necesariamente obliga (en
TODOS los casos) a que la clase sea heredada, claro que sería lo más conveniente (en programas "grandes") y lo más ventajoso, pero yo tranquilamente puedo tener un java main class como el siguiente ejemplo en el que no se cumple lo que dices:
Citarabstract sirve para forsar a que tengas que heredar de esa clase
:
public abstract class luis {
public static void main(String [] args) {
System.out.println("Hola");
}
}
public final class luis {
public static void main(String [] args) {
System.out.println("Hola");
}
}
Pero no me permite esto:
public abstract final class luis {
public static void main(String [] args) {
System.out.println("Hola");
}
}
Supongo que el compilador por definición ve como imcompatibles ambos modificadores. En todo caso , como pregunta curiosa esta bien, pero si no tienes ningún método sin implementación, ¿ para qué declarar a la clase como abstract ?
Y por cierto
Citarabstract sirve para forsar a que tengas que heredar de esa clase
esto no es correcto , el modificador no obliga a una clase a que herede de esta , sino a que IMPLEMENTE (que no es lo mismo que obligar a heredar) sus métodos, si no lo hace, la subclase también debe ser declarada con el modificador abstract .
Saludos
Hola, muchas gracias por tu respuesta. Te respondo esta pregunta ;)
Cita de: Didacso en 22 Octubre 2012, 22:19 PM
¿ para qué declarar a la clase como abstract ?
En mi caso declaro mi clase como abstract para evitar que algún
gracioso la instancie, como en este caso:
Declarando la clase sin abstract
public class Luis {
public static void main(String [] args) {
System.out.println("Hola");
}
}
Instanciando la clase anterior
public class TLuis {
public static void main(String [] args) {
Luis l = new Luis();
l.main(args);
}
}
Yo si quisiera evitar que alguien instancie una clase mía , simplemente haría esto :
public final class Luis {
// si declaramos el constructor como privado, NADIE podrá instanciar tu clase
private Luis(){}
public static void main(String [] args) {
System.out.println("Hola");
}
}
Creo que es mejor que declarar la clase como abstract, que dices ?
Saludos
Cita de: Didacso en 24 Octubre 2012, 21:24 PM
Creo que es mejor que declarar la clase como abstract, que dices ?
Saludos
;-) ;-) ;-) ;-) ;-)
Sí muchas gracias, esa era mi segunda opción, la de darle un constructor
private. Entonces me queda claro que no puedo usar abstract y final simultáneamente, y como dices, para lograr lo que pido lo único que podría hacer es declarar la clase como
final (para que no pueda ser heredada) y con un constructor
private (para que no pueda ser instanciada).
Quería darle
abstract porque al darle el modificador ese modificador como que siento que estoy convirtiendo a esa clase como una
clase fantasma :silbar: o algo así, bueno yo me entiendo. Gracias por sus respuestas ;-).