Почему этот класс не компилируется? - PullRequest
0 голосов
/ 07 июня 2018

Этот код не компилируется, и мне интересно, так ли это, потому что в Puppy нет конструктора (например, супер-конструктора или чего-то еще) или это из-за чего-то еще?

class Pet {
    String name;
    Pet(String name) {
        this.name = name;
    }
}
class Puppy extends Pet {}

public class fiddle {

    public static void main(String[] args ){
        Pet pup = new Puppy("Doggo");
    }
}

Ответы [ 5 ]

0 голосов
/ 07 июня 2018

Когда вы расширяете класс, вам все равно нужно вызвать его конструктор, чтобы вы могли инициализировать класс и его поля.Конструктор Pet принимает строку.По умолчанию, когда вы расширяете класс (как это делает Puppy), компилятор добавляет неявный вызов в конструктор без аргументов для удобства.Поскольку Pet не имеет конструктора без аргументов, этот код не компилируется.

Вы можете исправить это, вызвав конструктор, который явно принимает строку:

class Puppy extends Pet {
    Puppy(String name) {
        super("Puppy called " + name);
    }
}

или

class Puppy extends Pet {
    Puppy() {
        super("Puppy");
    }
}

Аналогично (хотя вы, вероятно, не хотите этого делать), ваш код скомпилируется, если вы удалите конструктор из Pet, потому что все будет происходить неявно:

class Pet {
}
class Puppy extends Pet {
}

Внутренне компилятор превращает это в:

class Pet {
    Pet() {
        // do nothing
    }
}
class Puppy extends Pet {
    Puppy() {
        super(); // call Pet's constructor
    }
}
0 голосов
/ 07 июня 2018

a constructor вызов на Puppy первой задачей будет вызов constructor из parent class.

Если бы parent class имел только default (no parameter) constructor, этоне представляет проблемы.Если вы добавите default constructor к parent class, опять же, нет проблем, но, поскольку в parent class такого constructor нет, вам необходимо указать child class, что делать.

Итак, вам нужно добавить constructor к вашему child class, который вызывает constructor из parent class.

Это может быть:

public Puppy(String input) {
  super(input);
}

или

public Puppy() {
  super("default"); // or null, if you prefer that
}

, но в качестве первого оператора необходимо вызвать существующий constructor из parent class.

0 голосов
/ 07 июня 2018

Ваш класс Puppy расширяется Pet.Pet имеет собственный конструктор, поэтому Puppy нужен такой же конструктор, как public Puppy(String name){...}

0 голосов
/ 07 июня 2018

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

Что-то вроде:

public Puppy(String name) {
   super(name);
}

или:

public Puppy() {
   super("puppy");
}
0 голосов
/ 07 июня 2018

См. this :

Подкласс наследует все члены (поля, методы и вложенные классы) от своего суперкласса.Конструкторы не являются членами, поэтому они не наследуются подклассами, но конструктор суперкласса может быть вызван из подкласса.

Вы можете изменить его на:

class Puppy extends Pet {
    public Puppy(String name) {
        super(name);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...