Java: унаследованный конструктор класса вызывает Super class - PullRequest
0 голосов
/ 04 сентября 2011

При создании java-программы я столкнулся с проблемой,

Конструктор подкласса выдает ошибку, вызывая метод суперкласса

Код похож на этот:

class Manage
{
    public static void main(String[] args) 
    {
        Manager m1 = new Manager ( 35 );
    }
}

class Employee
{
        int emp_id;
        public Employee(int id)
        {
                this.emp_id = id;
        }
        public int get_id()
        {
                return emp_id;
        }

}
class Manager extends Employee
{
        public Manager(int id )
        {
                this.emp_id = id ;
        }
}

class Engineer extends Employee
{
        public Engineer(int id)
        {
                this.emp_id = id ;
        }
}

А ошибка примерно такая:

$ javac app.java 
app.java:25: cannot find symbol
symbol  : constructor Employee()
location: class Employee
        {
        ^
app.java:33: cannot find symbol
symbol  : constructor Employee()
location: class Employee
        {
        ^
2 errors

Почему это происходит?

Ответы [ 4 ]

8 голосов
/ 04 сентября 2011

Суперкласс не имеет конструктора по умолчанию. Поэтому вам нужно передать соответствующие аргументы конструктора суперклассу:

super(id);

(Поместите это как верхнюю строку в конструкторы Manager и Engineer.) В обоих случаях также следует удалить строку this.emp_id = id.

В общем, если ваш конструктор не начинается с оператора super(...) или this(...) (и вы можете иметь только один из них, а не оба), то по умолчанию используется super() (без аргументов) .

3 голосов
/ 04 сентября 2011

Поскольку вы указали конструктор с аргументами, Java не предоставляет конструктор по умолчанию без аргументов. Вы должны создать его самостоятельно или явно вызвать созданный вами конструктор, используя super(id) в качестве первой строки в конструкторах расширенных классов.

1 голос
/ 04 сентября 2011

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

1 голос
/ 04 сентября 2011

Ошибка генерируется, поскольку вы не определили конструктор по умолчанию (без аргументов) в Employee

class Employee {

    private int emp_id;

    public Employee() {
    }

    public Employee(int id)  {
            this.emp_id = id;
    }

    public int get_id() {
            return emp_id;
    }

}

но есть пара моментов, на которые следует обратить внимание: вы устанавливаете emp_id через конструктор и определяете геттер для его чтения. Кажется, что поле должно было быть частным. В противном случае вы можете просто получить доступ напрямую.

У вас уже есть конструктор в Employee, устанавливающий идентификатор, и вам не нужно определять тот же конструктор в том же классе. Просто используйте конструктор суперкласса.

class Manager extends Employee {

    public Manager(int id ) {
        super(id);  // calls the superclass constructor
    }

}

В этом случае вам не нужен конструктор по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...