2016-07-08 1 views
1

Java仮想メソッドの呼び出しの使用は何ですか?

public class Main { 
    public static void main(String [] args){ 
    A a = new B(); 
    B b = new B(); 

    b = (B)a; 
    a.callme(); 
    b.callme(); 
    a.Hello(); // show error : Hello is undefined for method A 
    } 
} 

次ない本はあなたが変数は、実行時に参照するオブジェクトに関連付けられた動作を得る」と言うこと)私は、次のコード

public class A { 
    public void callme() { 
    System.out.println("Calling of class A function "); 
    } 
} 

public class B extends A { 
    public void callme() { 
    System.out.println(" Calling of class B fuction "); 
    } 

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

と(メインを持っていると言います"メソッドのcallmeが呼び出されたときにBクラスの動作を取得しますが、メソッドHelloにアクセスすると、メソッドAのHelloが定義されていないというエラーが表示されます。なぜですか?

+1

からの書き込みをお勧めします。 – Jesper

+0

Behavior!= Interface – Fildor

答えて

0

aは、Bのインスタンスを指していても、タイプがAです。

Aには、Helloメソッド(abstractの宣言さえも)がありません。したがって、コンパイラはエラーを発生させます。コードを少し調整して

public abstract class A { 
    public abstract void Hello(); 
    /*the rest as before*/ 

に修正してください。 Aは、インタフェースの特性を前提としています。

1

多態性はこのようには機能しません。 AはBの親であるため、BはAのメソッドを継承することができます(息子は父のプロパティを継承することができます)が、Aはどのクラスが継承しているか分からないため(Aはその子であることはわかりません)。例については

、もう一つのクラスCがあるとします。

public class C extends A { 
public void callme(){ 

System.out.println(" Calling of class C fuction "); 
} 

public void Hello(){ 

System.out.println("hello guys, I am C"); 
} 
} 

、あなたはどのようにそれがない方法のないので、それが呼び出す必要があり、子クラス知っているだろう

a.Hello(); 

を使用している場合その子供。子どもが確実に実装することを知っている独自の抽象メソッドのみです。上記クラスにおいて

+0

それでは、A a = new B(); //仮想メソッドinvokationの利点は何ですか?私は単純にBクラスのオブジェクトを使って関数を呼び出すことができました。なぜ我々は仮想メソッド呼び出しを使用するのですか? –

0
public class B extends A { 
public void callme(){ 

System.out.println(" Calling of class B fuction "); 
} 

public void Hello(){ // hello method is only the part of class B not A. 

System.out.println("hello guys"); 
} 
} 

hello()方法は、Bの部分です。それはあなたが任意のメソッド名Hello()を持っていないクラスAの参照変数を使用ここでは、あなたの主なメソッド呼び出し

public static void main(String [] args){ 
A a= new B(); // object of b referred by (a) Reference Variable of A 
B b= new B(); // object of b referred by (b) Reference Variable of B 

b= (B)a; 
a.callme(); //override takes place and method of B's Callme() called 
b.callme(); //again override takes place here and method of B's Callme() called 
a.Hello();// buttttttt 
b.Hello(); // this will compile and executes fine. 
} 
} 

になりましたA.

の方法で上書きしません。したがって、メソッドの解決は行われません(Hello()のようなメソッドは見つかりません)。

Bの参照変数を使用してb.Hello()を呼び出そうとすると、正常に動作します。

ここで、Aのサブクラスであり、メソッド名Hello()を含む別のクラスCがあるとします。

public class C extends A { 

    public void Hello(){ // hello method is only the part of class B not A. 

    System.out.println("hello guys"); 
    } 
    } 
この

A a = new C(); 

のような主要な文で

、あなたがa.Hello()を呼び出そうと、次にどのHello()方法を呼び出します。コンパイラは混乱するでしょう。

したがって、この概念は、サブクラスのスーパークラスのメソッドをオーバーライドしようとする場合にのみ機能します。

0

親クラスは、それから派生したクラスを認識していますか?

キャストは実際のオブジェクトタイプを変更しません。参照型のみが変更されます。

は、私は非常にあなたに私のアップキャストおよび変数 `A`がA`は` Hello`メソッドを持っていない ``タイプA`およびクラスであるのでダウンキャストthe link

関連する問題