Требуются ли конструкторы Java при создании класса?Ошибка «конструктор не может быть применен к данным типам», когда ни один объект не был создан - PullRequest
0 голосов
/ 10 июня 2018

Я восстанавливаю следующий код из учебника.Когда я запускаю , выполняю его, я получаю следующую ошибку:

Конструктор Vierbeiner в классе Vierbeiner не может быть применен к данным типам;обязательно: java.lang.String найдено: нет аргументов причина: фактические и формальные списки аргументов различаются по длине

Насколько я понимаю, эта ошибка возникает из-за того, что родительский класс Vierbeiner имеет конструктор, который требует аргумент Stringи нет конструктора, не требующего аргумента.Я не понимаю, почему я получаю эту ошибку, не создавая объект класса Hund.Почему конструктор вызывается, когда я не создал объект класса Hund?Каждый существующий вопрос, который я видел об этой ошибке, включает создание объекта дочернего класса.

public class Vierbeiner {

    public static void main(String[] args){
         Vierbeiner hund = new Vierbeiner("Bello");
         hund.rennen();
    }

    String vierbeinerName;

    Vierbeiner(String pName) {
        vierbeinerName = pName;
    }

    public void rennen() {
        System.out.println(vierbeinerName+" rennt los!");
    }

}

class Hund extends Vierbeiner {
}

РЕДАКТИРОВАТЬ: В ответ на полученные ответы, мне все еще не ясно, почему следующее (случай 1) компилируется без проблем:

public class Vierbeiner{
    public static void main(String[] args){

         Vierbeiner hund = new Vierbeiner();
         Hund hund2 = new Hund();  
         // Hund hund3 = new Hund("doggy");    
    }

   String vierbeinerName;

   Vierbeiner() {
       vierbeinerName = "test";
   };

   Vierbeiner(String pName){

   }

   }

class Hund extends Vierbeiner{

};

В котором я создаю объект Hund, по-видимому, используя конструктор без аргументов, который я определил в классе Vierbeiner.

Но если я раскомментирую следующее (случай 2), я получаю ошибку компиляции:

Hund hund3 = new Hund("doggy");

В случае 1 компилятор обращается к родительскому классу Vierbeiner, чтобы найти конструктор без аргументов для создания объекта hund2.В случае 2 я бы ожидал, что компилятор сделает то же самое, то есть перейдет к родительскому классу Vierbeiner, чтобы найти конструктор строкового аргумента для создания объекта hund3, но, похоже, это не так без использования «super» иЯ не понимаю почему.

Ответы [ 2 ]

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

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

class Hund extends Vierbeiner {

    public Hund(String pName) {
        super(pName);
    }

};
0 голосов
/ 10 июня 2018

Вы получаете ошибку во время компиляции, а не ошибку или исключение во время выполнения.

Это означает, что код не выполняется, поэтому не было создано ни одного экземпляра класса - нет вызова какого-либо конструктора.

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

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

Поскольку в вашем коде отсутствует реализация такого рода - возникает ошибка, которую вы описали.

Простым возможным решением было бы предоставить реализацию конструктора по умолчанию, которая будет вызывать конструктор с одним параметромБазовый класс:

class Hund extends Vierbeiner{
    Hund() {
        super("DefaultName");
    }    

};

Это дополнение к вашему коду решает ошибку времени компиляции.

Более практичным подходом было бы убедиться, что у вашего производного класса также есть конструктор со строковым параметром, который затем может бытьпередается в конструктор базового класса:

class Hund extends Vierbeiner{
    Hund(String name) {
        super(name);
    }    

};

Ссылки:

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