2013-08-26 3 views
9

Couldy вы уточнить, почему это работает:Instance абстрактного класса

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(); 
    } 
} 

Я предполагаю, что это противоречит спецификации, где мы можем найти:

Это ошибка времени компиляции, если попытка сделанный для создания экземпляра абстрактного класса с использованием выражения создания экземпляра класса (§15.9).

ответ

-1

Абстрактный класс не может быть создан.

Вы должны создать класс расширения, который расширяет абстрактный класс, и поэтому istantiated этот новый класс.

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(); 
} 

I post this. Может быть полезно для вас. Иметь хороший день

21

Вы, возможно, не заметили разницы:

new AbstractClassCreationTest(){}; 

против

new AbstractClassCreationTest(); 

Это дополнительный {} это тело нового, безымянного класса, который расширяет абстрактный класс , Вы создали экземпляр anonymous class, а не абстрактного класса.

Теперь перейдите к абстрактному методу в абстрактном классе, посмотрите, как компилятор заставляет его реализовать его внутри {} анонимного класса.

7

Обратите внимание на разницу между:

AbstractClassCreationTest acct = new AbstractClassCreationTest(){};//case 1 

NonAbstractClassCreationTest acct = new NonAbstractClassCreationTest();//case 2 

case1 является anonymous class определение. Вы не экземпляр абстрактного класса; вместо этого вы создаете подтип указанного абстрактного класса.

+0

Когда я объявляю анонимный класс, однако я не использую абстрактный класс. Я не знаю, если это возможно. Я не могу найти что-либо в Интернете, и в вашей ссылке нет ссылки на ссылку между абстрактным и анонимным классом. –

3

Здесь не создает объект AbstractClassCreationTest класса, на самом деле вы создаете объект анонимного внутреннего класса, который расширяет AbstractClassCreationTest class.This происходит потому, что вы написали new AbstractClassCreationTest(){} not new AbstractClassCreationTest() Вы можете узнать больше о анонимном внутреннем классе из here

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