super () не позволяет мне вызывать супер-конструктор с параметрами - PullRequest
2 голосов
/ 22 августа 2011

Я хочу вызвать конструктор суперкласса, который принимает два аргумента, поэтому я вызываю супер (аргументы), но компилятор говорит:

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

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

Кстати, я использую NetBeans.Последняя версия.

РЕДАКТИРОВАТЬ: я удалил NetBeans, установил Eclipse, и теперь все работает отлично.Я не знаю и никогда не узнаю, почему NetBeans дал мне ошибку.Спасибо всем за вашу помощь.

public class Person
 {
 private String name;
 private int age;


 public Person() { name = " "; age = 0; }
 public Person(String nm, int ag) { name = nm; age = ag; }
 }


 public class BaseballPlayer extends Person
  {
  private int homeruns;
  private double bat_avg;


  BaseballPlayer()
  {
  super();
  homeruns = 0;
  bat_avg = 0;
  }

  BaseballPlayer(String name, int age, int hr, double bavg)
  {
  super(name, age); // THIS CAUSES AN ERROR. I DON'T KNOW WHY
  homeruns = hr;
  bat_avg = bavg;
  }
 } 

Ответы [ 6 ]

4 голосов
/ 22 августа 2011

кстати, ИМХО это лучшая форма, для этого:

public class Person
    ...
    public Person() { 
        this("", 0); // No-args constructor calls the arg'd version with default values
    }

    public Person(String nm, int ag) {
        name = nm;
        age = ag;
    }
    ...
}

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

2 голосов
/ 22 августа 2011

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

  1. У вас есть еще один Person класс
  2. , который«Другой» класс Person имеет другой конструктор
  3. Ваш файл с классом BaseballPlayer импортировал этот класс вместо

Заключение - проверьте операторы импорта (когда классы находятся в отдельном классе)файлы).

Кстати, удаление public из BaseballPlayer, когда они находятся в одном и том же файле, отличается от того, что вы пытаетесь достичь - BaseballPlayer будет закрытым пакетом, вместо этогоpublic.

EDIT:

ах, так как я не знаком с NetBeans:

  1. возможно, "оригинальный" класс Person не компилируется автоматически?
1 голос
/ 22 августа 2011

Моя первая мысль при взгляде на эту ошибку заключается в том, что в Netbeans включена опция Compile on Save . И хотя инкрементная компиляция удобна во многих случаях, в ней время от времени появляются некоторые хитрые ошибки, особенно когда вы начинаете изменять и добавлять конструкторы и расширять их. Иногда он запутывается и начинает кэшировать старую версию файла .class, потому что думает, что новая не компилируется.

[Редактировать: тот факт, что вы сказали, что раньше у вас было два класса в одном файле, прежде чем разделить их, является более чем достаточной причиной, чтобы вызвать конфликт пространства имен, который может заставить его попытаться скомпилировать против неправильной кэшированной версии] 1005 *

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

Если это не сработает, я бы также попробовал сборку из командной строки, потому что это помогло бы определить, является ли проблема проблемой конфигурации / кэширования netbeans, или есть какая-то другая ошибка в вашем коде (как, возможно, вы вы не компилируете в каталог, который вам кажется, или ваше имя файла не совсем правильное, или что-то еще, о чем netbeans менее требователен.

1 голос
/ 22 августа 2011

Я не знаю, решит ли это вашу проблему, но стоит попробовать.Теперь все ваши классы находятся в безымянном пакете по умолчанию.(Это то, что происходит, когда у вас нет оператора пакета.)

Это не рекомендуется, потому что произойдет много плохого.Какие плохие вещи произойдут?Я не знаю точно, потому что я всегда помещаю вещи в именованный пакет - как рекомендовано.Попробуйте поместить ваши классы в именованный пакет и посмотрите, есть ли у вас проблема.

1 голос
/ 22 августа 2011

Я использую NetBeans 7.0.1, и это работает под JDK 6 как один файл и как два отдельных файла, а также два отдельных файла в отдельных пакетах для меня.

Однако я бы попробовал одну вещь: вы должны объявить ваши конструкторы BaseballPlayer как публичные. То, как вы сейчас это написали, это настройка безопасности по умолчанию, которая является частной упаковкой. Если вы не намерены, чтобы ваши объекты BaseballPlayer были созданы только в виде экземпляра в пакете, в котором находится класс, и никогда не разделяются на подклассы, вам действительно следует изменить его на public.

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

1 голос
/ 22 августа 2011

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

...