programing

Java 오류:기본 생성자에 대해 암시적 수퍼 생성자가 정의되지 않았습니다.

prostudy 2022. 9. 4. 11:54
반응형

Java 오류:기본 생성자에 대해 암시적 수퍼 생성자가 정의되지 않았습니다.

다음과 같은 구조를 가진 간단한 Java 코드가 있습니다.

abstract public class BaseClass {
    String someString;
    public BaseClass(String someString) {
        this.someString = someString;
    }
    abstract public String getName();
}

public class ACSubClass extends BaseClass {
    public ASubClass(String someString) {
        super(someString);
    }
    public String getName() {
        return "name value for ASubClass";
    }
}

는 꽤 것이다.BaseClass 를 실장하고 .getName()독자적인 방식(표준 방식 패턴) 사용합니다.

이 방법은 잘 작동하지만 하위 클래스에 중복 생성자가 있는 것은 마음에 들지 않습니다.타이핑하기가 더 쉽고 유지보수가 어렵습니다.BaseClass모든 서브클래스를 변경해야 합니다.

서브클래스에서 컨스트럭터를 삭제하면 다음과 같은 컴파일 시간 오류가 발생합니다.

Implicit super constructor BaseClass() is undefined for default constructor. Must define an explicit constructor

제가 하려는 일이 가능할까요?

이 오류가 발생하는 이유는 생성자가 없는 클래스에 기본 생성자가 있기 때문입니다. 기본 생성자는 인수가 없으며 다음 코드와 동일합니다.

public ACSubClass() {
    super();
}

, no-arg ), 하는 클래스는 "BaseClass"를 할 수 super();BaseClass base base base 。

하위 클래스에 기본 클래스에 있는 생성자가 자동으로 포함된다고 생각할 수 있기 때문에 이 방법은 약간 직관에 반할 수 있습니다.

이 문제를 해결하는 가장 간단한 방법은 기본 클래스가 생성자를 선언하지 않거나(기본값인 no-arg 생성자를 가지거나) 선언된 no-arg 생성자를 갖는 것입니다(그 자체 또는 다른 생성자와 함께).그러나 대부분의 경우 이 접근방식은 적용할 수 없습니다.클래스의 정당한 인스턴스를 작성하려면 생성자에 전달되는 인수가 모두 필요하기 때문입니다.

이 오류에 대해 구글에서 검색하여 이곳에 도착한 사용자: 이 오류를 수신하는 다른 이유가 있을 수 있습니다.Eclipse는 프로젝트 설정이 있을 때 시스템 구성 불일치라는 오류를 표시합니다.

예를 들어 Java 1.7 프로젝트를 Eclipse로 가져올 때 1.7이 올바르게 설정되어 있지 않으면 이 오류가 발생합니다. 다음 '하다'로 됩니다.Project - Preference - Java - Compiler ★★★★★★★★★★★★★★★★★」switch to 1.6 or earlier, 에 가거나.Window - Preferences - Java - Installed JREsJRE 1.7 j수수 / j j j j j j 。

그것은 가능하지만 당신이 가진 방식으로는 가능하지 않다.

기본 클래스에 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 컨스트럭터를 추가합니다.

default no arg가 super()를 호출하면 super class에 arg가 없기 때문에 오류 메시지가 나타납니다.

그게 바로 그 자신에 대한 질문입니다.

이제 답을 확장해 보겠습니다.

다른 값(데이터)을 지정하기 위해 서브클래스(동작)를 작성하는 것이 의미가 없다는 것을 알고 계십니까?!!!! 당신이 했으면 좋겠어요.

"이름"만 변경되는 경우 파라미터화된 클래스 하나로 충분합니다.

이 기능은 필요 없습니다.

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 컨스트럭터의 메서드시그니처를 변경하려면 모든 서브클래스를 변경해야 합니다.

그래서 유전은 높은 결합을 만드는 인공물이지만, OO 시스템에서는 바람직하지 않습니다.그것은 피해야 하고 아마도 구성으로 대체되어야 한다.

정말로 서브클래스로서 필요한 것인지 생각해 보세요.그 때문에, 인스톨 되고 있는 인터페이스가 매우 빈번하게 사용되고 있습니다.

 public interface NameAware {
     public String getName();
 }



 class A implements NameAware ...
 class B implements NameAware ...
 class C ... etc. 

여기서 B와 C는 A로부터 물려받은 것으로, 이들 사이에 매우 높은 결합을 형성했을 가능성이 있습니다.인터페이스를 사용하면 결합이 감소합니다.A가 이 결합을 "NameAware"로 하지 않는다고 판단해도 다른 클래스는 끊어지지 않습니다.

물론 동작을 재사용하고 싶다면 이 방법은 작동하지 않습니다.

이 에러는, JRE 가 설정되어 있지 않은 경우에도 발생할 수 있습니다.그렇다면 JRE 시스템 라이브러리를 프로젝트에 추가해 보십시오.

Eclipse IDE 아래:

  1. Project --> Properties 메뉴를 열거나 Package Explorer에서 프로젝트를 오른쪽 클릭하여 Properties를 선택합니다(Windows에서는 Alt+Enter, Mac에서는 Command+I).
  2. Java 빌드 경로를 클릭한 다음 라이브러리 탭을 클릭합니다.
  3. Modulepath 또는 Classpath를 선택하고 Add Library...누릅니다.단추
  4. JRE 시스템 라이브러리를 선택하고 다음을 클릭합니다.
  5. Workspace 기본 JRE를 선택한 상태로 유지하고(다른 옵션을 선택할 수도 있음) 마침을 클릭합니다.
  6. 마지막으로 Apply and Close를 누릅니다.

또 다른 방법은 파생 클래스 컨스트럭터의 첫 번째 문으로서 필요한 인수를 사용하여 super()를 호출하는 것입니다.

public class Sup {
    public Sup(String s) { ...}
}

public class Sub extends Sup {
    public Sub() { super("hello"); .. }
}

위의 문제를 다음과 같이 해결했습니다.

  1. Project를 클릭합니다.
  2. [ Properties ]> [ Java Build Path ]> [ Library ]> [ JRE System Library ]> [ Edit ]을 클릭합니다.
  3. 기본 시스템 JRE 및 마침을 선택합니다.
  4. 적용 후 종료합니다.

이클립스는 서브클래스 컨스트럭터의 첫 번째 문으로 슈퍼클래스 컨스트럭터를 호출할 필요가 없는 경우에 이 에러를 표시합니다.

죄송합니다. 오늘 이 문제에 직면했습니다.이 문제에 직면한 모든 사람에게 - 가능한 이유 중 하나 - 전화하지 마십시오.super방법의 첫 번째 줄에.두 번째, 세 번째 및 다른 행에서 이 오류가 발생합니다.Super 콜은 당신의 메서드에서 가장 먼저 호출해야 합니다.이 경우에는 모든 것이 잘 되어 있다.

간단한 답변:base/parent/super 클래스에 인수 없이 생성자를 추가합니다.예를 들어,

        class Parent{
    
    String name;
    int age;
    String occupation;
            //empty constructor
            public Parent(){
            
        }
    
    public Parent(String name, int age, String employment){
    this.name = name;
    this.age = age;
    this.occupation = employment;
    }
}

// 부모 클래스에서 컨스트럭터 오버로드를 원하는 추가 컨스트럭터를 가질 수 있습니다.

슈퍼 클래스에 인수 없는 컨스트럭터가 없는 경우 컴파일 시간 오류가 발생합니다.오브젝트에는 이러한 생성자가 있기 때문에 오브젝트가 유일한 슈퍼클래스일 경우에는 문제가 없습니다.

// 그럼 상속하자

    class Child extends Parent{
              Child(String name, int age){
this.name = name;
this.age = age;
    }
    
    }

super()에서는 super class no-argument 생성자를 호출하고 super(파라미터 목록)에서는 일치하는 파라미터 목록을 가진 super class 생성자를 호출합니다.

여기 간단한 예가 있습니다.

public class A {
    public A(int i){
       //
    }

 }

class B extends A {
    public B(int i){
      super(i);
    }
  }

이 오류는 인수 없는 생성자를 기본 클래스에 추가하면 해결할 수 있습니다(아래 그림 참조).

건배.

 abstract public class BaseClass {
        // ADD AN ARGUMENTLESS CONSTRUCTOR TO THE BASE CLASS
        public BaseClass(){
        }

        String someString;
        public BaseClass(String someString) {
            this.someString = someString;
        }
        abstract public String getName();
    }

public class ACSubClass extends BaseClass {
    public ASubClass(String someString) {
        super(someString);
    }
    public String getName() {
        return "name value for ASubClass";
    }
}

이 오류가 발생하여 메서드 옆에 있는 예외를 try/catch block으로 제거하여 수정했습니다.

예: FROM:

public static HashMap<String, String> getMap() throws SQLException
{

}

수신처:

public static Hashmap<String,String> getMap()
{
  try{

  }catch(SQLException)
  { 
  }
}

언급URL : https://stackoverflow.com/questions/1197634/java-error-implicit-super-constructor-is-undefined-for-default-constructor

반응형