2012-03-06 4 views
3

При составлении этой программы я получаю error-конструктор подкласса в Java

class Person { 
    Person(int a) { } 
} 
class Employee extends Person { 
    Employee(int b) { } 
} 
public class A1{ 
    public static void main(String[] args){ } 
} 

error- Не можете найти Конструктор Person(). Зачем нужно определять Person()?

+0

Использование среды IDE, такой как Eclipse, немедленно даст вам подсказку и ярлык для исправления. –

ответ

21

При создании файла Employee вы создаете одновременно Person. Для того, чтобы убедиться, что Person правильно построен, компилятор добавляет неявный вызов super() в Employee конструктору:

class Employee extends Person { 
    Employee(int id) { 
     super();   // implicitly added by the compiler. 
    } 
} 

Поскольку Person не имеет конструктор без аргументов это терпит неудачу.

Вы решить либо

  • добавив явный вызов супер, как это:

    class Employee extends Person { 
        Employee(int id) { 
         super(id); 
        } 
    } 
    
  • или путем добавления конструктор без аргументов для Person:

    class Person { 
        Person() { 
        } 
    
        Person(int a) { 
        } 
    } 
    

Обычно конструктор no-arg также неявно добавляется компилятором. Как отмечает Binyamin Sharet в комментариях, это относится только к тому, что конструктор вообще не указан. В вашем случае у вас есть указан конструктор Person, поэтому не создается неявный конструктор.

+0

+1 стоит упомянуть, что по умолчанию существует пустой конструктор, но когда вы добавляете конструктор, пустой конструктор больше не используется. – MByD

+0

@BinyaminSharet, хороший момент. Ответ обновлен. – aioobe

2

Конструктор для Employee не знает, как построить суперкласс, Person. Если вы явно не указали это, он по умолчанию попытается создать конструктор no-args суперкласса, которого не существует. Отсюда и ошибка.

Исправление:

class Employee extends person { 
    public Employee(int id) { 
     super(id); 
    } 
} 
1

Java фактически рассматривает этот код как:

class Person { 
    Person(int nm) { } 
} 
class Employee extends Person { 
    Employee(int id) { 
     super(); 
    } 
} 
public class EmployeeTest1 { 
    public static void main(String[] args){ } 
} 

Поскольку нет Person() конструктор это не удается. Вместо этого попробуйте:

class Person { 
    Person(int nm) { } 
} 
class Employee extends Person { 
    Employee(int id) { 
     super(id); 
    } 
} 
public class EmployeeTest1 { 
    public static void main(String[] args){ } 
} 
1

Java предоставляет вам конструктор по умолчанию, который не принимает никаких параметров. Конструктор также не имеет тела, поэтому это примерно так: public Person() {}. Когда вы определяете свой собственный конструктор, ваш конструктор (и) имеет место по умолчанию, поэтому в вашем случае Person(int nm){} имеет место Person() { }. Ваш вызов пытается неявно вызвать Person() { }, и поскольку этот конструктор больше не существует, код не работает. Взгляните на this предыдущий вопрос SO для получения дополнительной информации.

1

Над ответа является правильным, некоторым дополнением: вы можете прямо позвонить в супер (Int N), чтобы избежать неявно добавления супер() здесь:

class Employee extends Person { 
    Employee(int id) { super(int id);} 
} 
  1. Если вы пишете не конструктора, компилятор неявно добавить по умолчанию (без параметров) в ваш класс.
  2. Если вы пишете какой-либо конструктор - компилятор не добавит конструктор по умолчанию.

PS: Извините за мое письмо. Английский не мой родной язык.

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