Ошибка конструктора в моем конструкторе подкласса

#java #constructor #subclass

#java #конструктор #подкласс

Вопрос:

Вот назначение:

Разработайте и реализуйте класс, представляющий Person, вместе с 3 подклассами, используя следующие рекомендации:

a. Создайте класс с именем Person и его три подкласса с именами Employee, Student, Retired .

б. У человека есть следующие поля данных: имя, год_о_рождения, isStudying и isEmployed. В нем также есть методы для установки и получения значений каждого из полей, а также метод для вычисления текущего возраста и отображения статуса человека. Конструктор, который устанавливает для полей isStudying и isEmployed значение false, также включен в класс Person . Вы можете добавить дополнительные поля данных и методы, если хотите.

1. Наконец, создайте тестовый класс Java, который имитирует использование вашего класса Person. В вашем тестовом классе вы должны как минимум: а) создать 4 экземпляра Person, б) напечатать имена ваших экземпляров, в) распечатать статус ваших экземпляров на основе значений их атрибутов age, isStudying и isEmployed.

 public class Person2 {//begin class
    //declare variables
    String name;
    int year_of_birth;
    boolean isStudying;
    boolean isEmployed;
    int age;

public Person2(String name, int year_of_birth, boolean isEmployed, boolean isStudying, int age){//begin constructor
    this.name = name;
    this.year_of_birth = year_of_birth;
    this.isEmployed = false;
    this.isStudying = false;
    this.age = age;
}//end constructor

public int getYear(){//get year method
        return year_of_birth;
}//end method

public String getName(){//get name method
        return name;
}//end method

public boolean getEmployed(){//get employed method
        return isEmployed;
}//end method

public boolean getStudying(){//get employed method
        return isStudying;
    }//end method

public int getAge(){//get year method
        age = 2014 - year_of_birth;
    return age;
}//end method

public void setName(String name){//set name method
        this.name = name;
}//end method

public void setYear (int year){//set year method
        this.year_of_birth = year;
}//end method

public void setEmployed(boolean employed){//set employed method
        this.isEmployed = employed;
}//end method

public void setAge (int age){//set year method
        this.age = age;
}//end method

public static void main(String[] args) {
        // TODO code application logic here
}

}

class Student extends Person2 {//begin class

    public Student(String name, int year_of_birth, boolean isEmployed, boolean isStudying, int age){//begin constructor
        this.name = name;
        this.year_of_birth = year_of_birth;
        this.isEmployed = isEmployed;
        this.isStudying = isStudying;
        this.age = age;
}//end constructor)

    @Override
    public int getYear(){//get year method
        return year_of_birth;
    }//end method

    @Override
    public String getName(){//get name method
        return name;
    }//end method

    @Override
    public boolean getEmployed(){//get employed method
        return isEmployed = false;
    }//end method

    @Override
    public boolean getStudying(){//get employed method
        return isStudying = true;
    }//end method

    @Override
    public int getAge(){//get year method
    age = 2014 - year_of_birth;
    if (age > 30){
        System.out.println("Person is not a student");
    }
    return age;
}//end method

}
  

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

Комментарии:

1. можете ли вы опубликовать, где вы получаете ошибку? Также вы, похоже, не вызываете конструктор суперкласса в Student?

Ответ №1:

Ваша проблема в том, что вы не вызываете суперконструктор Person2 . Ваш конструктор в Student пытается вызвать конструктор по умолчанию (без аргументов) Person2 , который не существует.

У вас есть только один конструктор Person2 , и вы должны вызвать этот конструктор из конструктора Student :

 public Student(String name, int year_of_birth, boolean isEmployed, boolean isStudying, int age) {
    super(name, year_of_birth, isEmployed, isStudying, age);
}
  

Это также означает, что вам не нужно повторять весь этот код инициализации дважды.

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

Комментарии:

1. и по умолчанию Java пытается вызвать (несуществующий) конструктор без параметров

2. Смотрите мою правку о вашем коде в целом. Можете ли вы принять ответ, если он правильный?

Ответ №2:

При расширении любой функциональности вы должны попытаться использовать эту функциональность…
Ваш class Student extends Person2 , но использует ли он что-нибудь из Person2 ?

Почему вы переопределяете все методы и предоставляете идентичную функциональность в своем подклассе???

Комментарии:

1. Мы работаем над переопределением на этой неделе в классе. Из видео в классе говорится, что вам нужно сделать это при использовании модулей в подклассе.

2. Посмотрите видео еще раз — любая непубличная функциональность из суперкласса доступна в подклассе. Вам нужно переопределить ее только в том случае, если вы меняете поведение.