2017-05-04 8 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_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の出力を記述し、適切なところに「エラー」を書き込むように依頼された過去の割り当てにありました。 – mathStudent1936

+1

"また、たとえばClassA_Type bla = new ClassB()のように正確にはどういう意味ですか? < - クラスAはあなたのケースでは抽象であり、インターフェースではありませんが、これはとにかく説明しなければなりません(同じ原則):[「インターフェースへプログラムする」とはどういう意味ですか?」(http://stackoverflow.com/questions/) 383947/what-does-it-mean-to-interface-to-interface) –

答えて

2
ClassA twoA = new ClassA(); 

また、それは、例えば

ClassA twoA = new ClassB(); 
+0

また、 'oneC' ORVもありません。コンパイルエラーにもなります。 – hagrawal

2

が持っている、にClassAが抽象的であるため、サブクラスだけを意味するのインスタンスであることができ、正確に何を意味していますoracle documentation page on 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() 

を使用する利点は次のとおりです。将来的には

、クラスCはにClassAを拡張する場合、あなたは、単に

ClassA_Type bla = new ClassC() 

変更することができますベースクラスどの具体的な実装でもインスタンス化できます

+0

ありがとう!また、blaがClassA_TypeかInterfaceA_Typeの場合、それはどういう意味ですか/クラスの型に基づいて正確にバインドされているのでしょうか? – mathStudent1936

+1

ClassCがClassBを拡張するとInterfaceAが実装される場合、Class Cは1)ClassB型2)Class A型(Class BはClass Aを拡張しているため)3)InterfaceA type –

0

にはメソッドmethodFourがないためコンパイルできません。コンパイラは、変数の宣言された型のメンバのみを認識できます。

あなたが尋ねた割り当ては、「拡大変換」の例であり、JLSが詳しく説明しています。それについて読むことができます。