Definición de una clase abstracta sin métodos abstractos


114

¿Puedo definir una clase abstracta sin agregar un método abstracto?


1
Un buen ejemplo se puede encontrar en el patrón del decorador, ver aquí . Ambos WindowDecoratory CoffeeDecoratorson abstractclases, pero ninguno incluye un abstractmétodo.
MS Dousti

Respuestas:


168

Por supuesto.

Declarar un resumen de clase solo significa que no permite que se cree una instancia por sí solo.

Declarar un método abstracto significa que las subclases deben proporcionar una implementación para ese método.

Los dos son conceptos separados, aunque obviamente no puede tener un método abstracto en una clase no abstracta. Incluso puede tener clases abstractas con finalmétodos, pero nunca al revés.


14

Sí, tú puedes hacerlo. ¿Por qué no intentas hacer eso?


6
Y no es solo el OP. ¡Mira todos los votos positivos que ha obtenido la pregunta!
Marc W

54
@ karim79 No hay necesidad de caballos altos y todas esas cosas de servir salsa. Probarlo no revela por qué está permitido, mientras que preguntarlo podría.
biziclop

7
@bizclop: probarlo por sí mismo podría haber dado lugar a una pregunta más productiva. No hay caballos altos. Esto es bastante sencillo. Su pregunta fue '¿Puedo?' En lugar de '¿Por qué hace esto ...?'.
karim79

8
Si la pregunta se puede responder con un simple sí o no, entonces el autor de la pregunta debería considerar reformular, usar Google o simplemente probarlo.
Tyler Treat

3
@ karim79 Sí, la pregunta podría haberse formulado mejor, pero supongo que no se necesita mucho esfuerzo para mirar un paso adelante.
biziclop

8

Sí tu puedes. La clase abstracta utilizada en Java significa que no puede crear un objeto de la clase. Y un método abstracto, las subclases tienen que proporcionar una implementación para ese método.

Por lo tanto, puede definir fácilmente una clase abstracta sin ningún método abstracto.

Como por ejemplo :

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

Esto esta bien.


6

SÍ Puede crear una clase abstracta sin ningún método abstracto, el mejor ejemplo de clase abstracta sin método abstracto es HttpServlet
El método abstracto es un método que no tiene cuerpo, si declaró al menos un método en la clase, la clase debe declararse como un resumen es obligatorio PERO si declaraste la clase abstracta, no es obligatorio declarar el método abstracto dentro de la clase.

No puede crear objetos de clase abstracta, lo que significa que no se pueden crear instancias.


4

Sí, puede declarar una clase que no puede instanciar por sí misma con solo métodos que ya tienen implementaciones. Esto sería útil si quisiera agregar métodos abstractos en el futuro, o si no deseara que la clase se instanciara directamente aunque no tenga propiedades abstractas.


La pregunta no era sobre clases abstractas vacías, solo clases abstractas sin métodos abstractos. Por lo que puedo ver, no hay ninguna razón válida para usar una clase abstracta completamente vacía.
biziclop

1
Respuesta fija. El uso de una clase abstracta vacía podría ser útil si tiene una buena razón para querer agregar métodos abstractos más adelante y no tener que lidiar con la refactorización de ninguna otra clase principal.
Gordon Gustafson

1
En medio de una jerarquía, una clase abstracta completamente vacía (excepto por la especificación de herencia) puede tener sentido si las derivaciones de esa clase tendrán obligaciones contractuales diferentes de las de otras derivaciones del padre.
supercat

3

sí, podemos declarar una clase abstracta sin ningún método abstracto. el propósito de declarar una clase como abstracta no es instanciar la clase.

entonces dos casos

1) clase abstracta con métodos abstractos.

este tipo de clases, debemos heredar una clase de esta clase abstracta y debemos anular los métodos abstractos en nuestra clase, por ejemplo: clase GenricServlet

2) clase abstracta sin métodos abstractos.

este tipo de clases, debemos heredar una clase de esta clase abstracta, por ejemplo: el propósito de la clase HttpServlet es, aunque si no implementas tu lógica en la clase secundaria, puedes obtener la lógica principal

por favor verifique el código fuente de HttpServlet


2

Sí, podemos tener una clase abstracta sin métodos abstractos ya que ambos son conceptos independientes. Declarar un resumen de clase significa que no se puede instanciar por sí solo y solo se puede subclasificar. Declarar un método abstracto significa que el método se definirá en la subclase.


¿Por qué no debería querer que no se pueda crear una instancia de la clase? ¿Alguna buena razón, ejemplo?
karlihnos

2

Sí, puede definir una clase abstracta sin un método abstracto. Sin embargo, si no hay un método dentro, es mejor que utilice una interfaz


4
Buena idea para tomar el límite mínimo de 30 caracteres.
Marc W

1
Si no existe un método abstracto, ¿cómo se puede utilizar una interfaz? La interfaz tiene todos los métodos abstractos por defecto.
Usman Rana

1

Si tu puedes hacerlo.

Declarar clase abstracta significa que ninguna otra clase instanciará la clase.

y debe haber al menos un método abstracto dentro de eso y el significado de eso, puede declarar un método abstracto en esa clase si no está declarando un método que está bien.

ejemplo:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

esto funcionará con seguridad.


1

Sí tu puedes. A veces le pueden hacer esta pregunta: ¿cuál es el propósito de hacer esto? La respuesta es: a veces tenemos que restringir la instanciación de la clase por sí misma. En ese caso, queremos que el usuario extienda nuestra clase abstracta y cree una instancia de la clase secundaria


1

Puedes, la pregunta en mi mente es más deberías. Desde el principio, diré que no hay una respuesta rápida y precisa. Haga lo correcto para su situación actual.

Para mí, la herencia implica una relación "es-un". Imagine una clase de perro, que se puede ampliar con subtipos más especializados (alsaciano, caniche, etc.). En este caso, hacer que la clase de perro sea abstracta puede ser lo correcto ya que los subtipos son perros. Ahora imaginemos que los perros necesitan un collar. En este caso, la herencia no tiene sentido: no tiene sentido tener una relación 'es-un' entre perros y collares. Esta es definitivamente una relación 'tiene-a', el collar es un objeto colaborador. Hacer que el collar sea abstracto solo para que los perros puedan tener uno no tiene sentido.

A menudo encuentro que las clases abstractas sin métodos abstractos están expresando realmente una relación "tiene-a". En estos casos, generalmente encuentro que el código se puede factorizar mejor sin usar la herencia. También encuentro que las clases abstractas sin método abstracto son a menudo un olor a código y, como mínimo, deberían dar lugar a que surjan preguntas en una revisión de código.

Nuevamente, esto es completamente subjetivo. Es muy posible que haya situaciones en las que una clase abstracta sin métodos abstractos tenga sentido, depende totalmente de la interpretación y la justificación. Tome la mejor decisión para lo que sea en lo que esté trabajando.


1

En realidad, no hay ningún medio si una clase abstracta no tiene ningún método abstracto. Una clase abstracta es como un padre. Este padre tiene algunas propiedades y comportamientos, cuando tú de niño quieres ser hijo del padre, el padre dice que el niño (tú) debe ser así, es nuestro MOTO, y si no quieres hacerlo, tú no eres mi hijo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.