Является ли наследование причиной моей ошибки компиляции?

#java #inheritance

#java #наследование

Вопрос:

Почему код не компилируется? итак, в чем причина, по которой он не компилируется, может кто-нибудь указать или разработать это для меня?

 class Pet{
    public Pet(int age){
        System.out.print("Pet age: "   age);
    }
}
public class Cat extends Pet{
    public Cat(){
        System.out.print("Cat");
    }
    public static void main(String[] args) {
        new Pet(5);
    }
}
  

Журнал ошибок:

 Cat.java:7: error: constructor Pet in class Pet cannot be applied to given types;
    public Cat(){
                ^
  required: int
  found:    no arguments
  reason: actual and formal argument lists differ in length
1 error
  

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

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

2. Ваше предположение о том, что наследование является ошибкой, верно. Cat() необходимо каким-то образом вызвать конструктор суперкласса ( Pet(int) ), который принимает возраст, или Pet() необходимо добавить ctor без аргументов.

3. Сколько лет коту? Если у всех домашних животных есть возраст, а кошка является домашним животным, то кошке нужен возраст, но вы никогда его не указываете.

Ответ №1:

Cat Конструктор должен вызвать конструктор суперкласса Pet с age аргументом.

Например, что-то вроде этого:

 public Cat(int age){
    super(age)
    System.out.print("Cat");
}
  

Ответ №2:

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

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

Чтобы исправить ошибку, либо создайте пустой конструктор в своем родительском классе, либо вызовите параметризованный конструктор из вашего родительского класса.

Это измененная версия вашего кода, которая должна работать.

 class Pet{
public Pet(int age){
    System.out.print("Pet age: "   age);
}
}
public class Cat extends Pet{
    public Cat(int age){
        super(age);
        System.out.print("Cat");
    }
    public static void main(String[] args) {
        new Cat(5);
    }
}
  

Ответ №3:

Ваш класс Cat наследуется от класса Pet.

Для класса Pet требуется целое число в его конструкторе по умолчанию.

Поэтому конструктор Cat по умолчанию должен вызывать конструктор Pet с целочисленным параметром.

В качестве альтернативы вы можете определить конструктор по умолчанию в Pet, который не принимает целое число.

Вы должны иметь возможность вызывать родительский конструктор как таковой:

 public class Cat extends Pet{
    public Cat(){
        super(3); 
        System.out.print("Cat");
    }
}
  

Ответ №4:

Когда вызывается конструктор Cat() класса Cat, он внутренне вызывает конструктор по умолчанию родительского класса Pet. Хотя, когда вы объявили параметризованный конструктор для класса Pet, там больше не существует конструктора по умолчанию.

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

Ответ №5:

В конструкторе Cat будет вызван родительский конструктор (Pet). Итак, вам либо нужно определить конструктор без аргументов по умолчанию в классе Pet, либо вызвать super(5) в конструкторе Cat по умолчанию.

Ответ №6:

Конструктор по умолчанию отсутствует в Pet. поскольку вы расширяете Pet в Cat, вам нужен суперконструктор, чтобы избежать этого

 class Pet{
   public Pet(){};
    public Pet(int age){
        System.out.print("Pet age: "   age);
    }
}
public class Cat extends Pet{
    public Cat(){
        System.out.print("Cat");
    }
    public static void main(String[] args) {
      
        new Pet(5);

    }
}
  

Ответ №7:

вы должны вызвать суперкласс с целочисленным параметром. когда основной метод вызывает новый объект, он вызывает конструктор Cat, он будет искать суперкласс без конструктора arg. но конструктора arg нет, поэтому необходимо либо добавить конструктор суперкласса по умолчанию, либо вызвать параметр super with . пример кода приведен ниже.

     class Pet{
    public Pet(int age){
        System.out.print("Pet age: "   age)}}
public class Cat extends Pet{
    public Cat(){
        super(5);
        System.out.print("Cat");}
    public static void main(String[] args) {
        new Pet(5);}}