2012-07-25 2 views
0

그래서 저는 일부 코드에서 약간의 걸림돌을 발견했습니다.추상 생성자를 확장합니까?

추상 클래스 :

public abstract class TestParent { 
    int size; 

    public TestParent(int i){ 
     size = i; 
    } 

} 

아이 클래스 : 기본적으로 나는 코드의 다음과 같은 세 가지 맛있는 가벼운 음식을

 public class TestChild extends TestParent{ 
    public void mult(){ 
     System.out.println(this.size * 5); 
    } 

} 

구현 :

public class TestTest { 

    public static void main(String args[]) { 
     TestChild Test = new TestChild(2); 
     Test.mult(); 
    } 
} 
+6

내가 그것을 놓쳤는가? 나는 질문을 보지 않는다.) – jeff

+0

@jeff 질문 : 왜 슈퍼 클래스가 기본 no-arg 생성자를 사용하지 않을 때 –

+0

을 컴파일하지 않는가? 구현자는 생성자를 제공해야한다. – jeff

답변

2

다음과 같은 추상 클래스의 경우를 고려하고 구현을 확장하십시오. https://stackoverflow.com/a/260755/1071979

abstract class Product { 
    int multiplyBy; 
    public Product(int multiplyBy) { 
     this.multiplyBy = multiplyBy; 
    } 

    public int mutiply(int val) { 
     return muliplyBy * val; 
    } 
} 

class TimesTwo extends Product { 
    public TimesTwo() { 
     super(2); 
    } 
} 

class TimesWhat extends Product { 
    public TimesWhat(int what) { 
     super(what); 
    } 
} 

슈퍼 클래스의 제품은 추상적이고 생성자가 있습니다. 구체적인 클래스 TimesTwo에는 값 2를 하드 코딩하는 기본 생성자가 있습니다. 구체적인 클래스 TimesWhat에는 호출자가 값을 지정할 수있는 생성자가 있습니다.

참고 : 부모 추상 클래스에 기본 (또는 인수 없음) 생성자가 없으므로 하위 클래스에 사용 된 생성자를 지정해야합니다.

초록 생성자는 클래스를 설정하는 데 필요한 최소 필드와 같은 클래스 제약 조건이나 불변 조건을 적용하는 데 자주 사용됩니다.

1

당신이 명시 적으로 생성자에서 정의한 수퍼 클래스 및 인수가 정의되지 않은 생성자가없는 경우 하위 클래스는 슈퍼 클래스 생성자를 명시 적으로 호출합니다.

public class TestChild extends TestParent{ 
     TestChild() 
     { 
      super(5); 
     } 
    } 

매개 변수가있는 수퍼 클래스 생성자를 호출하지 않으려면 수퍼 클래스에 인수가없는 생성자를 추가해야합니다.

public abstract class TestParent { 
    int size; 
    public TestParent(){ 

    } 
    public TestParent(int i){ 
     size = i; 
    } 

} 
1
public class TestChild extends TestParent{ 
    public TestChild(int i){ 
     super(i); // Call to the parent's constructor. 
    } 
    public void mult(){ 
     System.out.println(super.size * 5); 
    } 

} 
1

사용 super 부모를 호출하는 (TestParent.TestParent(int)) 생성자 :

public class TestChild extends TestParent{ 

    public TestChild(int i) { 
     super(i); 
    } 

    //... 

} 

또는 일부 상수 사용하려는 경우 : 그런 일이 없다는 것을

public TestChild() { 
     super(42); 
    } 

주 자바에서 추상 생성자로. 본질적으로 TestChild 생성자를 호출하기 전에 호출되어야하는 TestParent에는 하나의 생성자 만 존재합니다.

또한 super()은 항상 첫 번째 문이어야합니다.

0

기본 클래스에 기본 생성자가 없기 때문에 코드를 작성하지 않을 수 있습니다. 기본 클래스로 제공해야하거나 파생 클래스에서 매개 변수화 된 생성자를 제공하고 super를 호출해야합니다.

0
public class TestChild extends TestParent{ 
      public TestChild (int i) 
      { 
       super(i * 2); 
      } 

} 

이 코드는 i의 배수를 사용합니다. 이것은 무엇보다 당신이 무엇을 물어보고 싶은지 확실하지 않지만 우선합니다.

다른 솔루션 :이 솔루션에 대한

public class TestChild extends TestParent{ 
      public TestChild (int i) 
      { 
       super(i); 
       this.size = 105; 
      } 

} 

는 크기가 보호 또는 공공해야합니다.

관련 문제