/ / Czy można zadeklarować anonimową klasę jako abstrakcyjną? - java, klasa abstrakcyjna, abstrakt, klasa anonimowa

Czy możliwe jest zadeklarowanie anonimowej klasy jako abstrakcyjnej? - java, klasa abstrakcyjna, streszczenie, anonimowa klasa

Próbuję dowiedzieć się, czy można stworzyć anonimową klasę wewnętrzną jako abstrakcję.
Pomyślałem, że to nie ma sensu, ponieważ próbuję utworzyć instancję klasy abstrakcyjnej, ale wiadomość z kompilatora pomyliła mnie:

Klasa „Anonimowa klasa pochodząca z testu” musi być albo zadeklarowane streszczenie lub zaimplementuj metodę abstrakcyjną „method ()” w teście

Kod:

abstract class Test{
abstract void method();
}
Test o = new Test(){};


Jeśli możliwe jest zadeklarowanie anonimowej klasy jako abstrakcyjnej, daj mi znać, jak to zrobić.
Byłbym wdzięczny za odpowiedź.

Odpowiedzi:

5 dla odpowiedzi № 1

Widzieć JLS Sec 15.9.5 (podkreślenie moje):

Anonimowa deklaracja klasy jest automatycznie uzyskiwana z wyrażenia tworzenia instancji klasy przez kompilator Java.

Anonimowa klasa nigdy nie jest abstrakcyjne (§ 8.1.1.1).

Anonimowa klasa jest zawsze niejawnie ostateczna (§ 8.1.1.2).

Klasa anonimowa jest zawsze klasą wewnętrzną (§ 8.1.3); nigdy nie jest statyczny (§ 8.1.1, § 8.5.1).


0 dla odpowiedzi nr 2

nie można i nie ma sensu deklarować klasy anonimowej jako klasy abstrakcyjnej jako anonimowej tylko raz jako klasy lokalnej.

myślę, że otrzymujesz ten błąd z powodu podobnego problemu Klasa musi być zadeklarowana jako abstrakcyjna lub implementować błąd metody abstrakcyjnej


0 dla odpowiedzi № 3

Jak cytuje Andy Turner, odpowiedź na twoje pytanie brzmi NIE.

Myślę jednak, że chciałeś wiedzieć coś innego.

Dlaczego pojawia się ten komunikat kompilatora?

Kompilator jest tu trochę mylący. Oferuje dwa możliwe rozwiązania, w oparciu o które deklarujesz klasę (tę anonimową klasę), a następnie chcesz również utworzyć instancję tej klasy:

  1. utworzyć klasę pochodną (która jest klasą anonimowązawsze jest) abstrakcyjne, jest to w porządku dla klas normalnych i wewnętrznych, ale nie jest możliwe dla klas anonimowych, więc kompilator nie powinien tego sugerować
  2. zaimplementuj wszystkie metody i nie posiadaj metod abstrakcyjnych w swojej anonimowej deklaracji klasy

Aby rozwiązać rzeczywisty problem: po prostu zaimplementuj method() więc twoja anonimowa deklaracja klasy nie zawiera więcej abstrakcyjnych metod

abstract class Test{
abstract void method();
}
Test o = new Test()
{
void method()
{
// do something
};
};

Teraz wszystko jest zadeklarowane i kompilator nie powinien narzekać.