2011-02-10 6 views
7

Tengo problemas para entender el concepto detrás de las clases abstractas. La definición que estoy leyendo es que tienen al menos un método que se declara pero no se implementa, por lo que no se puede crear una instancia de la clase. La clase de calendario de Java es abstracta y no se puede crear una instancia con el operador Nuevo, sin embargo, hay un método llamado getInstance() que devuelve un objeto de calendario. ¿Como funciona esto?ayuda a comprender las clases abstractas: método de calendario de Java getInstance()

Calendar cal = new Calendar(); //doesn't work 
Calendar cal = Calendar.getInstance(); //works 
+1

La respuesta de Jon es excelente, pero aquí hay una adición rápida: las clases abstractas nunca se pueden crear instancias. NO TIENEN que contener ningún método abstracto, y de hecho, pueden y suelen contener muchos métodos que en realidad tienen código. En general, se marcan como abstractos porque no proporcionan alguna funcionalidad, y la expectativa es que una subclase proporcionará eso. – Kylar

+0

Subclases de fábrica abstractas que deciden qué instancia devolver –

+0

Todos, gracias por su ayuda. Después de leer sus respuestas, volví a leer los tutoriales de Java sobre la herencia y los métodos estáticos, y ahora lo tengo claro. – tmakino

Respuesta

16

Las clases abstractas no tienen tener cualquiera de los métodos abstractos. Así es como generalmente se hace.

Ahora Calendar.getInstance() trabaja por realmente creando una instancia de una subclase. Puedes llamarlo porque es un método estático. El valor de retorno se refiere a una instancia de la subclase relevante, pero el tipo de devolución es solo Calendar, lo cual está bien debido a las reglas normales de herencia.

He aquí un ejemplo del mismo tipo de enfoque, pero sin todas las complejidades de Calendar - aplican los mismos principios:

abstract class AbstractParent { 
    public static AbstractParent getInstance() { 
     // Normally you'd have code to work out which 
     // concrete class to actually use 
     return new ConcreteChild(); 
    } 

    public abstract void sayHello(); 
} 

class ConcreteChild extends AbstractParent { 
    @Override public void sayHello() { 
     System.out.println("Hello from ConcreteChild"); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     AbstractParent parent = AbstractParent.getInstance(); 
     parent.sayHello(); 
    } 
} 
1

Una clase abstracta puede implementar métodos estáticos.

getInstance() es un método estático que devuelve una implementación concreta predeterminada de la clase abstracta.

En este caso, creo que realmente devuelve una instancia de GregorianCalendar.

2

Dado que Calendar es una clase abstracta, no puede crear una nueva instancia como esa. Si nos fijamos en la doc, encontrar cualquier método con static Calendar que aparece en ella y encontrará getInstance(), por lo que puede hacer algo como esto: -

Calendar cal = Calendar.getInstance(); 

Ahora, si nos fijamos en el mismo documento nuevo, mira Direct Known Subclasses en la parte superior de la página, la clase cotizada (s) aquí son la aplicación de Calendario ... así que, en este caso, puede utilizar GregorianCalendar, como esto también: -

Calendar cal = new GregorianCalendar(); 

Ambas obras ..

1

The getI El método nstance() de la clase Calendar no devuelve un objeto de la clase Calendar, sino que devuelve un calendario con la "zona horaria y locale predeterminadas" en mi caso un GregorianCalendar que es una subclase de Calendar. :)

Cuestiones relacionadas