Default constructor java error

«Implicit super constructor character() is undefined. Must explicitly invoke another constructor.» Error [duplicate]

So I have a class called character(), and my second class ChooseCharacterGUI() extends that class, but when I try to initialize ChooseCharacterGUI() to create the application I get the error «Implicit super constructor character() is undefined. Must explicitly invoke another constructor.» This is the ChooseCharacterGUI() class.

public class ChooseCharacterGUI extends character < final String CharacterChoice; private JFrame frame; private JPanel ChooseCharacterMenu; private JPanel Home; // Launches application. public static void main(String[] args) < EventQueue.invokeLater(new Runnable() < public void run() < try < ChooseCharacterGUI window = new ChooseCharacterGUI(); window.frame.setVisible(true); >catch (Exception e) < e.printStackTrace(); >> >); > //Creates application public ChooseCharacterGUI()

It seems that you character class does not have a default constructor, and you should explicitly call it’s constructor in constructor of derived class

Your character class has no non-argument constructor, so you need to call the provided constructor explicitly.

There are at least 3 ways to fix it. (1) By writing a constructor for character with no arguments, (2) By writing a constructor for ChooseCharacterGUI that invokes a constructor of character , (3) by removing the words extends character . It is difficult to know without more information which is the right thing to do.

This is a common «Java newbie» problem; see link. The only other thing to add is that naming a class character is a Java style violation. But don’t change it to Character because that is a standard class name . and «borrowing» can lead to readability issues.

Читайте также:  You may need an appropriate loader to handle this file type webpack css

2 Answers 2

Most likely your character class has a parameterised constructor and no default constructor. E.g.

So your CharacterGUI class needs to have in its default constructor a call to the parameterised constructor of the super class. E.g.

Perhaps another concern is that your super class has a lowercase first letter, which is confusing, and you’re inheriting this in the class which also has the main function. This code might need a bit of refactoring when you’ve got it working.

Every class you write must have a constructor, and every constructor must invoke super. If you don’t write a constructor, Java generates one with no arguments that does nothing but call super() . If you write a constructor but don’t have a super call, Java inserts an invisible super() at the top. So if either of these automatic things is happening and the super class doesn’t have a no-args constructor (called a default constructor), you get this error.

So your character class must not have a default constructor. Either write one, or in your CharacterGUI class, call whatever character constructor you have.

I strongly suspect that you don’t actually want to have CharacterGUI extend character though. And also, by convention, character should be capitalized.

Linked

Hot Network Questions

Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.7.21.43541

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

Ошибка Java: неявный супер-конструктор не определен для конструктора по умолчанию

У меня будет довольно много подклассов BaseClass , каждый из которых реализует метод getName() по-своему (шаблон шаблона шаблона). Это хорошо работает, но мне не нравится иметь избыточный конструктор в подклассах. Это больше набирать и его трудно поддерживать. Если бы мне пришлось изменить сигнатуру метода конструктора BaseClass , мне пришлось бы изменить все подклассы. Когда я удаляю конструктор из подклассов, я получаю эту ошибку времени компиляции: Implicit super constructor BaseClass() is undefined for default constructor. Must define an explicit constructor Я пытаюсь сделать это?

Пожалуйста, оставьте «лишний» конструктор! Он поддерживает удобочитаемость вашего кода, и все современные IDE могут создавать его автоматически, поэтому вам просто нужно нажать на клавишу.

Год спустя я перечитал свой собственный вопрос, и мне пришло в голову, что я мог бы удалить конструкторы (в том числе в базовом классе), как предложил matt b, и затем использовать статический метод фабрики для построения экземпляров.

9 ответов

Вы получаете эту ошибку, потому что класс, у которого нет конструктора, имеет конструктор по умолчанию, который не имеет аргументов и эквивалентен следующему коду:

Однако, поскольку ваш BaseClass объявляет конструктор (и, следовательно, не имеет конструктора no-arg по умолчанию, который в противном случае предоставил компилятор), это незаконно — класс, который расширяет BaseClass, не может вызвать super(); , потому что есть не конструктор без аргументов в BaseClass.

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

Самый простой способ заключается в том, что базовый класс не объявляет конструктор (и, следовательно, имеет конструктор по умолчанию, no-arg) или имеет объявленный конструктор no-arg (сам по себе или рядом с любыми другими конструкторами). Но часто этот подход не может быть применен — ​​потому что вам нужны все аргументы, которые передаются в конструктор для создания законного экземпляра класса.

«Это, вероятно, немного нелогично, потому что вы можете подумать, что у подкласса автоматически есть любой конструктор, который есть у базового класса». +1

Ради потомков я предложу свое решение для будущих читателей: создайте конструктор без аргументов в BaseClass но сделайте так, чтобы он просто генерировал BaseClass UnsupportedOperationException или что-то в этом роде. Это не лучшее решение (оно ложно предполагает, что класс может поддерживать конструктор без аргументов), но это лучшее, что я могу придумать.

Для тех, кто Google для этой ошибки и прибывает сюда: может быть другая причина для его получения. Eclipse дает эту ошибку, если у вас есть настройка проекта — несоответствие конфигурации системы.

Например, если вы импортируете проект Java 1.7 в Eclipse и у вас нет правильной настройки 1.7, вы получите эту ошибку. Затем вы можете перейти к Project — Preference — Java — Compiler и switch to 1.6 or earlier ; или перейдите к Window — Preferences — Java — Installed JREs и добавьте/исправьте установку JRE 1.7.

Просто получил эту ошибку без видимой причины в Eclipse. Затем я очистил рабочее пространство (меню Проект -> Очистить . ) и все прошло.

Возможно, но не так, как у вас есть.

Вам нужно добавить конструктор no-args в базовый класс и что он!

public abstract class A < private String name; public A()< this.name = getName(); >public abstract String getName(); public String toString() < return "simple class name: " + this.getClass().getSimpleName() + " name:\"" + this.name + "\""; >> class B extends A < public String getName()< return "my name is B"; >public static void main( String [] args ) < System.out.println( new C() ); >> class C extends A < public String getName() < return "Zee"; >> 

Если вы не добавляете конструктор (any) в класс, компилятор добавляет для вас конструктор по умолчанию no arg.

Когда defualt no arg вызывает super(); и поскольку у вас его нет в суперклассе, вы получите это сообщение об ошибке.

Что касается вопроса, то это сам.

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

Если единственное, что есть изменения, это «имя», то достаточно одного параметризованного класса!

MyClass a = new A("A"); MyClass b = new B("B"); MyClass c = new C("C"); MyClass d = new D("D"); 
MyClass a = new A(); // internally setting "A" "B", "C" etc. MyClass b = new B(); MyClass c = new C(); MyClass d = new D(); 

Когда вы можете написать это:

MyClass a = new MyClass("A"); MyClass b = new MyClass("B"); MyClass c = new MyClass("C"); MyClass d = new MyClass("D"); 

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

Хорошо, что наследование — это артефакт, который создает HIGH-сцепление, что нежелательно в OO-системах. Его следует избегать и, возможно, заменить композицией.

Подумайте, действительно ли они действительно нужны в качестве подкласса. Вот почему вы часто сталкиваетесь с интерфейсами, которые были использованы insted:

 public interface NameAware < public String getName(); >class A implements NameAware . class B implements NameAware . class C . etc. 

Здесь B и C могли бы унаследовать от A, которые бы создали очень высокую связь между ними, используя интерфейсы, связь уменьшилась, если A решит, что больше не будет «NameAware», остальные классы не будут нарушены.

Конечно, если вы хотите повторно использовать поведение, это не сработает.

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

@ChssPly76 ChssPly76: Да, но это, вероятно, потому, что наследование используется плохо. Я расширил свой ответ, чтобы покрыть это.

эта ошибка возникла из-за неправильной настройки JRE, поэтому выполните следующие действия:

1. щелкните правой кнопкой мыши проект → Свойства → Путь сборки Java → вкладка «Вкладка» Библиотеки »
2. Нажмите Добавить библиотеку
3. Выберите Системную библиотеку JRE → Нажмите «Далее» 4. Выберите «Рабочее пространство» по умолчанию jre или альтернативный установленный jre
5. нажмите «Готово»

Eclipse предоставит эту ошибку, если у вас нет вызова конструктора суперкласса в качестве первого оператора в конструкторе подкласса.

Источник

Если в классе создаю конструктор — не могу наследовать класс, что можно сделать?

Конструктор по умолчанию это конструктор без аргументов, он подразумевается для классов, у которых в листинге нет ни одного конструктора и его нет у классов с уже объявленным конструктором с аргументами

Вот так должен выглядеть класс:

class Salad < private int numIngridients; public Salad()<>public Salad(int numIngridients) < this.numIngridients = numIngridients; >public String[][] salatik() < String[][] salaticOK = new String[numIngridients][3]; return salaticOK; >> 

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

class Calories extends Salad < public Calories (int numIngridients)< super(numIngridients); >> 

There is no default constructor available in ‘Salad’ .

Нет конструктора по умолчанию в классе Salad, так создайте его.

Сделать это просто (в принципе выше об это уже написано) public Salad()<> . Да это конструктор с параметром, однако наследуемый класс по умолчанию должен создаваться точно с таким же конструктором с параметром, но для текущих реалий — в наследуемом классе требуется создание объекта конструктором без параметров (конструктор по умолчанию), а поскольку его нет, то и выдается ошибка.

There is no default constructor available in ‘Salad’ «

Если нет конструктора по умолчанию в суперклассе, а есть в подклассе, то можно создать конструктор без аргументов в суперклассе (если этого сделать нельзя, то см. далее). Без этого невозможно создать экземпляр подкласса, так как конструктор по умолчанию является конструктором без аргументов (обратное неверно) и он будет неявно вызывать такой же конструктор суперкласса при создании экземпляра подкласса. И если в подклассе есть какой-нибудь конструктор, то конструктор по умолчанию не существует.

Для создания экземпляра подкласса требуется последовательно вызывать конструкторы суперклассов, поэтому если какой нибудь из конструкторов отсутствует, то его надо создавать явно. Если в суперклассе есть конструктор с аргументами, следовательно отсутствует конструктор по умолчанию, и в подклассе нужно создавать такой же конструктор, который вызывает конструктор суперкласса и передаёт ему аргументы. Для этого в первой строке конструктора подкласса надо вызывать конструктор суперкласса следующим образом

Что-то наподобие того как в этом ответе.

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

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

Источник

Error: Could not instantiate bean class — No default constructor found;

I am trying to persist an object of Test type in my database through Spring and Java Persistence API I have a Test table in my database and I have created the corresponding Entity Class:

 @Entity @Table(name = "test") @XmlRootElement @NamedQueries(< @NamedQuery(name = "Test2.findAll", query = "SELECT t FROM Test t"), @NamedQuery(name = "Test2.findByTestId", query = "SELECT t FROM Test t WHERE t.testId = :testId"), @NamedQuery(name = "Test2.findByTestint", query = "SELECT t FROM Test t WHERE t.testint = :testint"), @NamedQuery(name = "Test2.findByText", query = "SELECT t FROM Test t WHERE t.text = :text")>) public class Test implements Serializable < private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "testId") private Integer testId; @Column(name = "testint") private Integer testint; @Basic(optional = false) @Temporal(TemporalType.TIMESTAMP) private Date endtime; @Column(name = "text") private String text; public Test() < >public Test(Integer testId) < this.testId = testId; >public Test(Integer testId, Date starttime, Date endtime) < this.testId = testId; this.starttime = starttime; this.endtime = endtime; >public Integer getTestId() < return testId; >public void setTestId(Integer testId) < this.testId = testId; >public Integer getTestint() < return testint; >public void setTestint(Integer testint) < this.testint = testint; >public String getText() < return text; >public void setText(String text) < this.text = text; >> 
 @Repository("testDao") public class JpaTestDao implements TestDao < public JpaTestDao(EntityManagerFactory emf) < this.emf = emf; >@PersistenceUnit private EntityManagerFactory emf;// = null; EntityManager em; public EntityManager getEntityManager() < return emf.createEntityManager(); >@Transactional @Override public void create(Test test) < em = null; try < em = getEntityManager(); em.getTransaction().begin(); em.persist(test); em.getTransaction().commit(); >finally < if (em != null) < em.close(); >> > > 
 Could not instantiate bean class [com.mycompany.jpa.JpaTestDao]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.mycompany.jpa.JpaTestDao. 

Источник

Оцените статью