2015-09-02 6 views
16
abstract class A { 
    public void disp() { 
     System.out.print("Abstract"); 
    } 
} 

public class B { 
    public static void main(String args[]) { 
     A object = new A(){ }; 
     object.disp(); 
    } 
} 

Я знаю, что абстрактные классы не могут быть созданы, но запутаны в этом коде. Собственно, что означает этот код?Можно ли создать экземпляр абстрактного класса?

+0

Меня огорчает то, что этот явно дублированный вопрос собрал * 13 * upvotes. – Raedwald

ответ

30

Тонкость здесь находится в "{}". Это означает, что вы явно предоставляют анонимную реализацию для недостающих частей (недостающие части - абстрактные методы) абстрактного класса A, что позволяет вам создать его экземпляр.

Но нет абстрактного метода в A, поэтому анонимная реализация пуста.

Пример, показывающий поведение, по меньшей мере, одного абстрактного метода:

public abstract class A { 
    public abstract void bar(); 
    public void disp() { System.out.print("Abstract"); } 
} 

public class B { 
    public static void main(String args[]) { 
     A object = new A() { 
      @Override public void bar() { System.out.print("bar"); } 
     }; 
     object.disp(); //prints "Abstract" 
     object.bar(); //prints "bar" 
    } 
} 
+0

Я не могу решить, является ли это «классной» вещью, что Java имеет то, что C# не имеет; к обходному пути для java изначально не было делегатов и событий. –

+0

Есть ли причина объявить класс А абстрактным, даже если в нем нет абстрактных методов (как в примере вопроса OP)? Почему бы просто не удалить «абстрактный» классификатор из объявления класса A. – Brandin

+0

@Brandin - возможно, вам нужен базовый класс с несколькими не абстрактными методами, которые никогда не должны быть созданы? Например, класс 'Shape', который наследуется' Triangle', 'Square' и т. Д. И имеет общий метод' getLocation() ', но вы никогда не хотите, чтобы кто-то делал экземпляр' Shape' , Он существует только для наследования. – Davor

14

Это называется анонимный внутренний класс. Вы не создаете абстрактный класс, вы создаете анонимный внутренний класс бетон, который расширяет абстрактный класс. Разумеется, для того, чтобы это было разрешено, анонимный внутренний класс должен обеспечивать реализации для всех абстрактных членов абстрактного суперкласса ... который он делает в этом случае, потому что абстрактный суперкласс не имеет абстрактных членов.

Смежные вопросы