2017-05-04 2 views
1

다음 일련의 클래스와 인터페이스가 컴파일됩니다. 그러나이 코드 이후의 다음 클래스는 그렇지 않습니다.오류 + 상속 + 인터페이스

public abstract class ClassA { 
    public void methodOne() { 
     System.out.println("Hello from methodOne."); 
    } 

    public int methodTwo(int a, int b) { 
     return a + b; 
    } 

    public abstract int methodThree(int a, int b); 
} 

public interface InterfaceA { 
    int methodOne(int a, int b); 
} 

public class ClassB extends ClassA { 
    public int methodOne(int a) { 
     return 5 * a; 
    } 

    public int methodTwo(int a, int b) { 
     return 2 * super.methodTwo(a, b); 
    } 

    public int methodThree(int a, int b) { 
     return a * b; 
    } 
} 

public class ClassC extends ClassB implements InterfaceA { 

    public int methodOne(int a, int b) { 
     return a % b; 
    } 

    public int methodThree(int a, int b) { 
    return a ‐ b; 
} 

    public void methodFour(int a) { 
     System.out.println("Here is number: " + a); 
    } 
} 

public class ClassD extends ClassC { 
    public void methodFour(int a, int b) { 
     System.out.println("Here is the sum: " + (a + b)); 
    } 

} 

다음 출력에서는 컴파일하는 동안 오류가 발생하지만 그 이유는 무엇입니까? 또한, 그것을 정확히 무엇를 ClassA가 추상적이기 때문에 예를 들어, ClassA_Type bla = new ClassB()?

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

     ClassA oneA = new ClassB(); 
     System.out.println(oneA.methodOne(5)); 

     InterfaceA oneIA = new ClassD(); 
     oneIA.methodFour(6, 7); 


    } 
} 
+3

정확한 오류 메시지를 추가하는 것이 좋습니다. – Berger

+0

@Berger 문제는 이전 과제에서 SomeClass의 결과를 명시하고 적절한 경우 "error"를 작성하도록 요청했습니다. – mathStudent1936

+1

"또한 ClassA_Type bla = new ClassB()와 같은 경우 정확히 무엇을 의미합니까?" <- 클래스 A는 귀하의 경우 추상적이지만 인터페이스는 아니지만 어쨌든 설명해야합니다 (동일한 원칙) : [ "인터페이스에 프로그램"한다는 것은 무엇을 의미합니까?] (http://stackoverflow.com/questions/) 383947/what-does-it-mean-to-program-to-an-interface) –

답변

2
ClassA twoA = new ClassA(); 

는 당신이

ClassA twoA = new ClassB(); 
+0

또한 'oneC' ORV가 없으므로 컴파일 오류가 발생합니다. – hagrawal

2

예를 들어, 인스턴스가 될 수 있습니다 서브 클래스에서만 의미,이 작업을 수행하지 못할 때, 의미 오라클 설명서 페이지에서 abstract classesoverriding

추상 클래스는 ac입니다. 추상적으로 선언 된 라스는 추상적 인 방법을 포함 할 수도 있고 포함하지 않을 수도 있습니다. 추상 클래스는 인스턴스화 할 수 없지만 서브 클래 싱 할 수는 있습니다. 또한

의 쿼리에 대해서는

ClassA twoA = new ClassA(); 

(ClassA는 추상 클래스이고 인스턴스화 할 수 없기 때문에)

인해 위의 이유로는, 문 아래에 정확히, 컴파일 오류가 발생합니다 예를 들어, ClassA_Type bla = new ClassB() 일 때를 의미합니까?

콘크리트 클래스 ClassB, 하위 클래스 ClassA이 생성되었음을 의미합니다.

추상 클래스가 하위 클래스로 분류 될 때 하위 클래스는 일반적으로 상위 클래스에있는 모든 추상 메서드에 대한 구현을 제공합니다. 이 경우 추상 메서드 methodThreeClassB에 구현되었습니다.

ClassA_Type bla = new ClassB() 

대신

ClassB_Type bla = new ClassB() 

사용의 장점은 다음과 같습니다 ClassC가를 ClassA를 확장하는 경우

미래에, 당신은 간단하게 변경할 수 있습니다

ClassA_Type bla = new ClassC() 

기본 클라 ss는 임의의 구체적인 구현으로 인스턴스화 될 수 있습니다. InterfaceA에는 methodFour 메서드가 없기 때문에

+0

감사! 또한, bla가 ClassA_Type 또는 InterfaceA_Type 인 경우, 그 의미는 무엇입니까/클래스 유형에 기초하여 정확히 바인딩되는 것은 무엇입니까? – mathStudent1936

+1

ClassC가 ClassB를 확장하면 InterfaceA가 구현되고 Class C는 1) ClassB 유형 2) Class A 유형 (Class B는 Class A를 확장) 3) InterfaceA 유형 –

0

oneIA.methodFour(6, 7);이 컴파일되지 않습니다. 컴파일러는 선언 된 변수 유형의 멤버 만 인식 할 수 있습니다.

당신이 물어 본 과제는 "확대 변환"의 예이며, JLS가 자세히 설명합니다. 거기에 대해 읽어보십시오.