SORU
24 AĞUSTOS 2009, PAZARTESİ


Java'da soyut sınıf

"Soyut sınıf" Java mı nedir

CEVAP
24 AĞUSTOS 2009, PAZARTESİ


Soyut bir sınıf örneği oluşturulamıyor olan bir sınıftır. Soyut bir sınıf devralmasını bir alt sınıf oluşturma tarafından kullanılırolabilirörneği. Soyut bir sınıf devralmasını alt sınıf için birkaç şey yapar:

  1. Miras alt sınıf tarafından kullanılan yöntemleri tanımlar.
  2. Miras alt uygulanması gereken soyut yöntemler tanımlamak.
  3. Alt sınıfın diğer sınıfları ile yer değiştirebilir sağlayan ortak bir arayüz sağlar.

İşte size bir örnek:

abstract public class AbstractClass
{
    abstract public void abstractMethod();
    public void implementedMethod() { System.out.print("implementedMethod()"); }
    final public void finalMethod() { System.out.print("finalMethod()"); }
}

"() AbstractMethod" herhangi bir yöntem gövdesi yok. dikkat edin Bu nedenle, aşağıdakileri yapabilirsiniz:

public class ImplementingClass extends AbstractClass
{
    // ERROR!
}

abstractMethod() uygulayan bir yöntem yok! JVM new ImplementingClass().abstractMethod() gibi bir şey olduğunda bunu yapmak gerekiyordu ne olduğunu bilmek için bir yol var.

İşte bir doğru ImplementingClass.

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
}

implementedMethod() finalMethod() tanımlamak zorunda değilsiniz dikkat edin. Zaten AbstractClass tarafından tanımlanmış.

İşte ImplementingClass başka bir doğru.

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
    public void implementedMethod() { System.out.print("Overridden!"); }
}

Bu durumda, implementedMethod() geçersiz.

Ancak, final anahtar kelime nedeniyle, aşağıdaki mümkün değildir.

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
    public void implementedMethod() { System.out.print("Overridden!"); }
    public void finalMethod() { System.out.print("ERROR!"); }
}

Başka uygulamalara izin verilecektir, hiç. AbstractClass 26 *uygulanması finalMethod() son uygulama olarak işaretlendi çünkü bunu yapamazsın:

Şimdiayrıcasoyut bir sınıf iki kez uygulamak:

public class ImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("abstractMethod()"); }
    public void implementedMethod() { System.out.print("Overridden!"); }
}

// In a separate file.
public class SecondImplementingClass extends AbstractClass
{
    public void abstractMethod() { System.out.print("second abstractMethod()"); }
}

Şimdi bir yerlerde başka bir yöntem yazabilirsiniz.

public tryItOut()
{
    ImplementingClass a = new ImplementingClass();
    SecondImplementingClass b = new SecondImplementingClass();
    AbstractClass c = new ImplementingClass();
    AbstractClass d = new SecondImplementingClass();

    a.abstractMethod();    // prints "abstractMethod()"
    a.implementedMethod(); // prints "Overridden!"
    a.finalMethod();       // prints "finalMethod()"
    b.abstractMethod();    // prints "second abstractMethod()"
    b.implementedMethod(); // prints "implementedMethod()"
    b.finalMethod();       // prints "finalMethod()"
    c.abstractMethod();    // prints "abstractMethod()"
    c.implementedMethod(); // prints "implementedMethod()"
    c.finalMethod();       // prints "finalMethod()"
    d.abstractMethod();    // prints "second abstractMethod()"
    d.implementedMethod(); // prints "implementedMethod()"
    d.finalMethod();       // prints "finalMethod()"
}

ImplementingClass AbstractClass, AbstractClass yöntemin bir örneği olarak ImplementingClass tedavi edilirken implementedMethod(), bozdu bile çağrıldı dikkat edin. c örnek ImplementingClass yöntemini çağırmak için, ((ImplementingClass) c).implementedMethod(); gibi bir durum olurdu.

Son olarak, aşağıdaki işlemleri yapamaz:

public class ImplementingClass extends AbstractClass, SomeOtherAbstractClass
{
    ... // implementation
}

Bir sınıf sadece bir kez uzatılabilir. Eğer birden çok sınıfları genişletmek için ihtiyacınız varsa, arayüzleri olmalılar. Bunu yapabilirsiniz:

public class ImplementingClass extends AbstractClass implements InterfaceA, InterfaceB
{
    ... // implementation
}

İşte size bir örnek arayüz:

interface InterfaceA
{
    void interfaceMethod();
}

Bu temelde aynıdır:

abstract public class InterfaceA
{
    abstract public void interfaceMethod();
}

Tek fark ikinci yolu derleyici aslında bir arayüz olduğunu haber değil. Bu insanlar sadece arayüzü ve hiçbir Diğerleri uygulamak istiyorsanız, bu yararlı olabilir. Eğer soyut bir sınıf soyut yöntem varsa, ancak, başparmak genel acemi bir kural olarak, muhtemelen bir arayüz yapmak gerekir.

Aşağıdaki yasadışı

interface InterfaceB
{
    void interfaceMethod() { System.out.print("ERROR!"); }
}

Bir arabirim yöntemleri uygulayamıyor. Bu iki farklı arayüzleri uygulamak, bu arayüzler farklı yöntemleri çarpışır. Beri tüm yöntemleri bir arabirim soyut, uygulanması yöntemi, ve o zamandan beri senin yöntem tek uygulamada miras ağacı, derleyici bilen var kullanmak için yöntem.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Awesome Toys TV

    Awesome Toys

    18 HAZİRAN 2014
  • Numberphile

    Numberphile

    15 EYLÜL 2011
  • Tek Syndicate

    Tek Syndicat

    23 Temmuz 2008

İLGİLİ SORU / CEVAPLAR