2011-02-10 18 views
7

Soyut sınıfların ardındaki kavramları anlamakta zorlanıyorum. Okuduğum tanım, beyan edilen ancak uygulamadan yoksun olan en az bir yönteme sahip olmaları, böylece sınıfın somutlaştırılamamasıdır. Java takvim sınıfı soyut ve Yeni operatör kullanılarak başlatılamıyor, ancak bir takvim nesnesini döndüren getInstance() adında bir yöntem var. Bu nasıl çalışıyor?soyut sınıfları anlamada yardımcı olur: java takvim yöntemi getInstance()

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

Jon'un cevabı mükemmel - ama hızlı bir ekleme: Soyut sınıflar hiçbir zaman örneklenemez. Herhangi bir soyut yöntem içermeleri gerekmez ve aslında, aslında içinde kod bulunan birçok yöntem içerebilir ve yapabilirler. Genellikle soyut olarak işaretlenirler çünkü bir parça işlevsellik sağlamazlar ve beklenti bir alt sınıfın bunu sağlayacağıdır. – Kylar

+0

Özet fabrika alt sınıfları hangi örneğe döneceğine karar verir –

+0

Herkes, yardımlarınız için teşekkürler. Yanıtlarınızı okuduktan sonra, geri dönüp, miras ve statik yöntemlerle ilgili java eğitimlerini tekrar okudum ve şimdi bana açık. – tmakino

cevap

16

Özet sınıflar herhangi soyut yöntemler olması yok yoktur. Bu genellikle nasıl yapılır?

Şimdi bir alt sınıfın bir örneğini oluşturarak aslında tarafından Calendar.getInstance() çalışır. Onu aramak için izin verildi, çünkü bu statik bir yöntem. Dönüş değeri, ilgili alt sınıfın bir örneğini ifade eder, ancak dönüş türü, normal kalıtım kurallarından dolayı iyi olan yalnızca Calendar'dur.

İşte yaklaşımın aynı türden bir örnek, ama Calendar tüm karmaşası olmadan - aynı ilkeler geçerlidir: Bir GregorianCalender dönen

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

Bir soyut sınıf statik yöntemleri uygulamak CAN bakın.

getInstance(), soyut sınıfın varsayılan somut uygulamasını döndüren statik bir yöntemdir.

Bu durumda, aslında bir GregorianCalendar örneğini döndürdüğüne inanıyorum.

2

Calendar, soyut bir sınıf olduğundan, bunun gibi yeni bir örnek oluşturamazsınız. Eğer doc bakarsak, üzerinde listelenen static Calendar ile herhangi bir yöntem bulmak ve getInstance() bulacaksınız, bu nedenle böyle bir şey yapabilirsiniz: - Tekrar aynı doküman bakarsak

Şimdi
Calendar cal = Calendar.getInstance(); 

, bakmak Sayfanın üst kısmındaki Direct Known Subclasses, burada listelenen sınıf (lar) bu durumda, siz de bunun gibi GregorianCalendar kullanabilirsiniz, Takvim uygulaması vardır ... bu yüzden: -

Calendar cal = new GregorianCalendar(); 

iki çalışması ..

1

Takvim sınıfının nstance() yöntemi, Takvim sınıfının bir nesnesini döndürmez; bunun yerine, bir takvim takvimi olan bir GregorianCalendar olan "varsayılan saat dilimi ve yerel ayar" ile bir takvim döndürür. :)

İlgili konular