¿Porqué una clase no puede ser abstract y final simultáneamente?

Iniciado por theluigy13etv, 21 Octubre 2012, 04:32 AM

0 Miembros y 1 Visitante están viendo este tema.

theluigy13etv

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:

sapito169

#1
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

Gallu

Yo me tiraría de una ventana también por tus faltas ortográficas sapito .
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

theluigy13etv

#3
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");
   }
}

Gallu

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

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

theluigy13etv

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);
    }
}

Gallu

Yo si quisiera evitar que alguien instancie una clase mía , simplemente haría esto :
Código (java) [Seleccionar]

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
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

theluigy13etv

#7
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  ;-).