2013-05-28 11 views
9

co z tym kodem tutaj tworzy obiekt klasy abstrakcyjnej lub klasy anonimowej? proszę powiedz mi, że jestem trochę zagmatwany tutaj.Tworzenie instancji klasy abstrakcyjnej lub anonimowej

public abstract class AbstractDemo { 

    abstract void showMessage(); 
    abstract int add(int x,int y); 

    public int mul(int x,int y){ 
     return x+y; 
    } 


    public static void main(String[] args) { 
     AbstractDemo ad = new AbstractDemo() { 

      @Override 
      void showMessage() { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      int add(int x, int y) { 
       // TODO Auto-generated method stub 
       return 0; 
      } 
     }; 

     System.out.println(ad.mul(10, 12)); 
     System.out.println(ad.getClass()); 
    } 

} 
+0

Czy próbowałeś skompilować ten kod? Jaki był rezultat? –

+2

Zauważ, że nadpisujesz abstrakcyjne metody. To anonimowa klasa. – Lion

+0

Dane wyjściowe to 22 klasa com.mj.javademo.AbstractDemo 1 – DroidNinja

Odpowiedz

23

utworzyć anonimowy klasę, która rozszerza klasę abstrakcyjną.

W poniższym przykładzie rozszerzono zakres AbstractDemo i udostępniono implementacje jego metod abstrakcyjnych.

new AbstractDemo() { 
    @Override 
    void showMessage() { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    int add(int x, int y) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
}; 
+1

mam to dzięki bro – DroidNinja

0

Jesteś nadrzędnymiabstract methods w anonymous class ..that dlatego można utworzyć obiekt. patrz poniżej.

 @Override // Here 
     void showMessage() { 
      // TODO Auto-generated method stub 

     } 

     @Override // here 
     int add(int x, int y) { 
      // TODO Auto-generated method stub 
      return 0; 

realizacja z Abstract Class może być instancja jak robisz.

+0

dzięki .. yeah .. – DroidNinja

4

Nie można utworzyć wystąpienia klasy abstrakcyjnej.
Można utworzyć instancję klasy rozszerzającej klasę abstrakcyjną.

Cały punkt klasy abstrakcyjnej jest taki, że jest abstrakcyjny - zdefiniowałeś interfejs, ale nie implementację. Bez implementacji tworzenie instancji klasy nie przyniosłoby znaczącego lub użytecznego wyniku. Jeśli ma/miałoby sens tworzenie instancji tej klasy, to po prostu nie chcesz używać klasy abstrakcyjnej w pierwszej kolejności.

Można użyć anonimowego klasy pojęcie na przykład jak poniżej:

AbstractDemo abstractDemo = new AbstractDemo() { 
      @Override 
      void showMessage() { 
       // TODO Auto-generated method stub 
      } 
      @Override 
      int add(int x, int y) { 
       // TODO Auto-generated method stub 
       return 0; 
      } 
     }; 
+1

Dobra odpowiedź teraz rozumiem. – DroidNinja

0

samodzielnym klasa abstrakcyjna za obiekt nie może być jednak anonimowa klasa abstrakcyjna obiekt może być wykonane, ponieważ jest zapewnienie wdrożenia wtedy i tam.

Powodem, dla którego Java nie zezwala na obiekt klasy abstrakcyjnej, ponieważ nie ma żadnej implementacji dla żadnej metody ani dla niektórych metod, więc jak mógłbyś mieć obiekt niekompletnej klasy. Ale w Anonimowy sposób dajesz jej implementację, więc pozwala ci mieć obiekt.

samej sprawie z interfejsem

AbstractDemo ad = new AbstractDemo() { 

      @Override 
      void showMessage() { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      int add(int x, int y) { 
       // TODO Auto-generated method stub 
       return 0; 
      } 
     }; 

Tutaj AbstractDemo klasa jest abstrakcyjna, ale jego realizacja może mieć klasę obiektu, tak, tutaj anonimowy kod klasy realizuje kod, dlatego, że jest doskonale może mieć obiekt.

Więcej kopanie do niego, patrz poniższy kod, MyAbstractClass jest klasą abstrakcyjną, teraz jeśli wykomentuj

abstract void play(); 

to działa dobrze, Java jest umożliwienie, aby obiekt tej klasy abstrakcyjnej, ale kiedy odkomentowanie, które jak, zaprzecza, ponieważ nie ma żadnej implementacji tej metody, więc zaprzecza, aby uczynić przedmiot.

abstract class MyAbstractClass { 
    private String name; 

    public MyAbstractClass(String name) 
    { 
     this.name = name; 
    } 

    public String getName(){ 
     return this.name; 
    } 
    abstract void play(); 



} 


public class Test2 { 

    public static void main(String [] args) 
    { 
     MyAbstractClass ABC = new MyAbstractClass("name") { 
     }; 

     System.out.println(ABC.getName()); 
    } 

} 

sprawdzić dokładnie to {} po powołaniu konstruktora, co oznacza, że ​​nie wymaga więcej realizacja, czy można zastąpić jego jeden z metody lub więcej.

+0

dane wyjściowe to com.mj.javademo.AbstractDemo 1 $, więc co to oznacza, że ​​odnosi się do którego obiektu? – DroidNinja

4

Oto co wydarzyło się w tym krótkim i nieszkodliwego kawałka kodu:

AbstractDemo ad = new AbstractDemo() { 

      @Override 
      void showMessage() { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      int add(int x, int y) { 
       // TODO Auto-generated method stub 
       return 0; 
      } 
     }; 
  1. nowa klasa została zdefiniowana (bez nazwy, tak zwaną klasę anonimową)
  2. Ta nowa klasa rozszerza AbstractDemo klasę
  3. Metody abstrakcyjne o numerach AbstractDemo zostały zastąpione w tej nowej klasie
  4. Nowa instancja t jego nowa klasa została stworzona i przypisana do zmiennej ad

Więcej o anonymous classes w Javie here.

+1

Doskonałe wyjaśnienie. – SAM

0

Twój AbstractDemo nie jest bardziej abstrakcyjny po tym, jak jego abstrakcyjne metody są zaimplementowane w anonimowej klasie. Jej tak dobrze, jak mówią:

Class AbstractDemoImpl extends AbstractDemo { 

    void showMessage() { 
      // TODO Auto-generated method stub 
    } 
    int add(int x, int y) { 
      // TODO Auto-generated method stub 
      return 0; 
    } 
} 
0

Tutaj dajemy realizację abstrakcyjnego class.By po raz czynimy obiekt, dajemy jej wdrażania i przesłanianie wszelkie abstrakcyjne methods.In przypadku abstrakcyjnej klasy posiadające jedynie konkretna metoda. Zobacz poniżej przykładzie

abstract class MyAbstractClass { 
    private String name; 

    public MyAbstractClass(String name) 
    { 
     this.name = name; 
    } 

    public String getName(){ 
     return this.name; 
    } 
} 

public class Test { 

    public static void main(String [] args) 
    { 
     MyAbstractClass ABC = new MyAbstractClass("name") { 
     }; 

     System.out.println(ABC.getName()); 
    } 
} 

jesteśmy tu właśnie czyni obiekt za pomocą powołując konstruktora jak {}.

  1. udowadniamy wdrożenie przy użyciu anonimowej klasy.

2.Co to jest tylko klasa bez nazwy, którą musimy zrobić, gdy robimy obiekt.

  1. Tak, tworzymy obiekt klasy abstrakcyjnej, udowadniając implementację w czasie wykonywania.

4.Otwórz odpowiedź tak, dlaczego klasa abstrakcyjna zezwala na konstruktor? ale nie możemy stworzyć obiektu tego.

5.Inne pytanie dotyczące klasy abstrakcyjnej to, że możemy mieć tylko blok statyczny w klasie abstrakcyjnej. Co to oznacza?

6. Tylko blok statyczny, ponieważ chcemy załadować tylko jeden raz bez rozszerzania i tworzenia jego obiektu.

7.Po kompilacji kodu uzyskujemy klasę każdej konkretnej klasy, klasy abstrakcyjnej lub interfejsu.

8. Tutaj pojawia się pytanie Dlaczego użytkownicy java nie pozwalają na blokowanie statyczne w interfejsie?

1
@Override // Here 
void showMessage() { 
    // TODO Auto-generated method stub 
} 

@Override // here 
int add(int x, int y) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

przede wszystkim trzeba wiedzieć, że nie można utworzyć instance dla abstract class, tutaj są tylko tworzenie anonymous class który zachowywał się jak inner class który rozciąga się abstract class więc jej należy do anonymous class.

Powiązane problemy