Czy możesz wyjaśnić, dlaczego to działa:
public abstract class AbstractClassCreationTest {
public void hello(){
System.out.println("I"m the abstract class" instance!");
}
public static void main(String[] args) {
AbstractClassCreationTest acct = new AbstractClassCreationTest(){};
acct.hello();
}
}
Przypuszczam, że jest to sprzeczne ze specyfikacją, w której możemy znaleźć:
Jest to błąd czasu kompilacji, jeśli podjęto próbę utworzenia instancji abstrakcji klasa używająca wyrażenia tworzenia instancji klasy (§15.9).
Odpowiedzi:
21 dla odpowiedzi № 1Być może nie zauważyłeś różnicy:
new AbstractClassCreationTest(){};
w porównaniu
new AbstractClassCreationTest();
To ekstra {}
to ciało nowej, bezimiennej klasy, która rozszerza klasę abstrakcyjną. Utworzyłeś instancję anonimowa klasa a nie klasy abstrakcyjnej.
Teraz śmiało zadeklaruj abstrakcyjną metodę w klasie abstrakcyjnej, zobacz, jak kompilator zmusza cię do jej implementacji wewnątrz {}
klasy anonimowej.
7 dla odpowiedzi nr 2
Zwróć uwagę na różnicę między:
AbstractClassCreationTest acct = new AbstractClassCreationTest(){};//case 1
NonAbstractClassCreationTest acct = new NonAbstractClassCreationTest();//case 2
przypadek 1 to jest anonimowa klasa definicja. Ty jesteś nie tworzenie instancji klasy abstrakcyjnej; zamiast tego tworzysz instancję a podtyp wspomnianej klasy abstrakcyjnej.
3 dla odpowiedzi nr 3
Tutaj nie tworzysz obiektu AbstractClassCreationTest
klasa, faktycznie tworzysz obiekt anonimowej klasy wewnętrznej, który rozszerza AbstractClassCreationTest
class.This dlatego, że napisałeś new AbstractClassCreationTest(){} not new AbstractClassCreationTest()
Możesz dowiedzieć się więcej o anonimowej klasie wewnętrznej tutaj
0 dla odpowiedzi nr 4
Klasa abstrakcyjna nie może zostać utworzona.
Musisz utworzyć klasę rozszerzeń, która rozszerza klasę abstrakcyjną i tak utworzyła nową klasę.
public abstract class AbstractClassCreationTest {
public void hello(){
System.out.println("I"m the abstract class" instance!");
}
}
public class MyExtClass extends AbstractClassCreationTest() {
}
public static void main(String[] args) {
MyExtClass acct = new MyExtClass(){};
acct.hello();
}
wysyłam to. Może ci się przydać. Miłego dnia