2012-03-06 33 views

Respuesta

4

¿Se puede extender cualquier clase normal?

Sí :) A menos que tenga el modificador final.

+1

1. Se corrigió un poco la redacción ... :) – Tudor

4

Sí, todos los métodos que no son definitivos (la estática también es un poco diferente del resto), pueden anularse, a menos que la clase en sí se declare definitiva. Los métodos abstractos solo se usan si no se proporciona ninguna implementación en la clase base.

1

Sí, puede ampliar una clase sin que deba definirse como abstracto. Lo que esto significa es que va a anular los métodos. Por ejemplo, es posible hacer una clase

DifferentString extends String 

entonces,

public String toString() 
{ 
    return "Something different"; 
} 

Esto significa que usted puede cambiar el comportamiento original de la clase padre.

Referencia:

http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

1

Como otros han dicho, sí - pero es una buena práctica para evitar hacerlo si puedes evitarlo, porque se puede terminar con lo que se conoce como el fragile base class problema más fácilmente.

+0

La clase base tan frágil es básicamente cambios en un método de superclase que da como resultado un comportamiento inesperado en la subclase. Pero, ¿es posible si el mismo método se anula en la subclase? –

+1

sí, si ese método reemplazado depende de cualquier otro método en la superclase. Un simple cambio en la superclase puede provocar un comportamiento inesperado en la subclase, incluso si la superclase aún cumple su contrato. – Robert

+0

De la página de Wikipedia, entiendo que usar Interfaces resuelve este problema.Pero, ¿cómo el uso de la palabra clave abstracta evita este problema? (O, ¿cómo no usar la palabra clave abstracta lo causa?) Lo siento, no entiendo completamente. –

2

No, no es necesario que tenga la palabra abstracta, la palabra abstracta simplemente no le permitirá crear una instancia de esa clase directamente; si utiliza la palabra abstracta, solo puede crear una instancia de las clases que extiendan esa clase abstracta.

AbstractClass abs = new ChildClass(); 
0

Aquí hay algunas confusiones de conceptos. Los métodos no implementados residen en una interfaz, y usted puede implementar esa interfaz.

Puede extender cualquier clase siempre que no sea definitiva.

Editar: Lo que quiero decir es que es preferible poner métodos no implementados en las interfaces también. Perdón por la pobre redacción. Las clases abstractas también pueden tener métodos no implementados, aunque terminará con una jerarquía compleja y rígida. .

+0

Una clase abstracta también contiene métodos no implementados ... – quaylar

+0

¿Tengo razón al decir que una clase abstracta DEBE tener al menos un método no implementado? –

+0

No. Puede tener o no tener métodos. –

1

Sí, pero si la clase está marcada como final, no se puede extender.

class Foo { 
    //some code here 
} 

class Boo extends Foo { 

} 
Cuestiones relacionadas