2015-06-20 5 views
0

У меня есть открытый абстрактный класс с именем EmployeeFileProcessor, который также я пытаюсь создать. Как я могу легко исправить этот код, чтобы я мог его создать?Как создать экземпляр абстрактного класса в Java?

public abstract class EmployeeFileProcessor 
{ 
    public static void main(String[] args) throws Exception 
    { 
     EmployeeFileProcessor process = new EmployeeFileProcessor(); 
     //Non important code here 
     process.writeFullTimeEmployee(user_input1, FtCollection[0]); 
     //Defined in another class (method writeFullTimeEmployee) 
     process.readFulltimeEmployee(user_input1); 
     //Defined in another class (method readFullTimeEmployee) 
    } 
} 

Как я могу использовать «процесс»?

+1

Вы не можете создать экземпляр абстрактного класса. Период. Так работает Java. Если ваш дизайн требует ускорения абстрактного класса, тогда вам нужно изменить свой дизайн. –

+1

. Большой вопрос: почему вы хотите, чтобы этот класс был абстрактным в первую очередь? Возможно, у вас ошибочное представление о том, что означает «абстрактное». – GrantRobertson

ответ

2

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

например.

public ConcreteEmployeeFileProcessor extends EmployeeFileProcessor { 

} 

Затем вы можете создавать экземпляры ConcreteEmployeeFileProcessor, но ссылаться на него с использованием абстрактного типа.

EmployeeFileProcessor instance = new ConcreteEmployeeFileProcessor(); 
2

Аннотация Класс - это класс, который вы, , не может создавать по определению. Он похож на интерфейс, за исключением возможности объявлять поля и фактически реализовывать функции в случае, если они не переопределены (для Java 8 вы можете использовать методы по умолчанию в интерфейсах).

Во всяком случае, если вы действительно хотите, чтобы экземпляр этого класса в пути по умолчанию, вы можете попробовать сделать это следующим образом:

EmployeeFileProcessor process = new EmployeeFileProcessor() {}; 

Но это, скорее всего, очень плохое дизайн ;-)

+0

* Он похож на интерфейс, за исключением возможности объявлять поля и фактически выполнять функции в случае, если они не переопределены *. Не правда. Интерфейсы также могут иметь конкретные методы. – CKing

+0

@ChetanKinger право, но только с Java 8, правильно? – pnadczuk

+0

Да. Вопрос был помечен как java, поэтому всегда лучше упомянуть конкретную версию Java, если ваш ответ основан на ней. – CKing

2

Вы не можете создать экземпляр класса abstract. У вас есть три варианта:

  1. Изменить EmployeeFileProcessor быть, не абстрактный класс, удаляя abstract из объявления класса.
  2. Instantiate анонимный внутренний подкласс вашего класса вместо: EmployeeFileProcessor process = new EmployeeFileProcessor() { }; (не рекомендуется)
  3. Измените все методы и поля в EmployeeFileProcessor к static. Таким образом, вам больше не нужно создавать экземпляр EmployeeFileProcessor. (Не рекомендуется, если ваш класс не имеет состояния)

Другими словами, не создавайте класс abstract, если вы хотите его создать.

+0

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

+0

Может ли downvoter оставить комментарий и сообщить мне, что не так с моим ответом? Как я вижу, я ответил на этот вопрос. – CKing

+0

Я отказался от вашего ответа, потому что 2, 3 и 4 по вашим собственным словам «Не рекомендуется», а пункт 1 не дает вам экземпляр абстрактного класса. – bhspencer

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