/ / Wystąpienie abstrakcyjnej klasy [duplikat] - java

Wystąpienie abstrakcyjnej klasy [duplikat] - java

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 № 1

Być 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