2017-05-31 16 views
-2

私はインターフェイスと3つのクラスを持っています。クラスBでは、printHelloというメソッドを定義します。次に、クラスTestでは、新しいIHelloオブジェクトが宣言され、新しいBに割り当てられます。インターフェイスで定義されていないメソッドを使用できないのはなぜですか?

「メソッドprintHello()は型が定義されていません」というエラーが表示されるため、コードがコンパイルされません。 IHello "私が混乱しているのは、タイプIHelloのオブジェクトを新しいBに割り当てることができるからです。したがって、そのオブジェクトにはインターフェイスがない場合でもBのメソッドを使用できるはずはありませんか?

この問題を解決するには、というメソッドをIHelloインターフェイスに宣言するか、代わりにタイプBのオブジェクトを宣言することができます。問題を解決するために他に何かできることはありますか?

インタフェースIHello

public interface IHello { 

    void hello(); 

} 

クラス

public class A implements IHello{ 

    public void hello(){ 
     System.out.println("hello"); 
    } 
} 

クラスB

public class B extends A { 

     public void printHello(){ 
      this.hello(); 
     } 
} 

クラスTest

public class Test { 

    public static IHello b; 

    public static void main(String[] args) { 

     b = new B(); 
     b.printHello(); //The method printHello() is undefined for type IHello 
    } 
} 
+3

***変数***の*タイプ*(*オブジェクト*ではない)とは何ですか?これはコンパイラが見るものです。これは途方もない時間にここで尋ねられてきました。 –

+0

変数の型はIHelloですが、 'B'に代入されているので、' B'のメソッドを使用できない理由を理解しようとしています。 –

+3

コンパイラは実際のオブジェクトタイプを見ていません。あなたが宣言したタイプ、IHelloを見ています。場合によっては、実行時にしか利用できない可能性があるため、コンパイラは実際のオブジェクト型を認識しない*かもしれません。 –

答えて

2

クラスBは、クラスAを拡張し、あなたのクラスAまたはBのいずれもがインタフェースIHelloと関係を持っていない、あなたのクラスAが実装である場合bのタイプはIHello

あるので、したがって、あなたはBのインスタンスを作成し、bに割り当てることができませんインタフェースIHello

public class A implements IHello{ 
    ... 
} 

は、あなたがタイプXXXのようにインスタンス変数xを宣言した場合、クラスXXXの唯一の方法は、インスタンスxに表示されていること。注意してくださいと、あなたはそれを作る必要がありますあなたのケースでは、bをIHelloとして宣言し、インスタンスbによってメソッドhello()のみがアクセスできます。printHello()にアクセスできません。Bとして宣言されたインスタンスのみがprintHello()を呼び出すことができます。インスタンスBをタイプBにキャストします。

+0

答えをありがとうが、その変更を加えても、私はまだ同じエラーが発生します。 –

+0

@OmarN最後の文章を見る – haifzhan

関連する問題