2016-09-16 15 views
0

ここは私の質問です。私はそれに抽象メソッドを持つスーパークラスを持っています。私がメインに行って、このコードサブクラスオブジェクトから抽象メソッドを呼び出す

Base b = new sub(); 
b.foo(); 

をしようとすると

public abstract class Base{ 

public abstract Boolean foo(); 

} 
public class sub extends Base{ 
@Override 
public Boolean foo(){ 
    System.out.printLn("This is foo in the sub class!"); 
} 
} 

ので、私は、エラーとメッセージ何を持っていない私の画面上に表示されます。私の前提は、コンパイラがbオブジェクトを見て、それをBaseオブジェクトとして見て、それがBaseオブジェクトからfooに行き、その後に実装がないと見て、それが子からfooをチェックアウトし、fooがそこに実装されているので、メッセージを表示します。私は正しい?

+0

ベースをコンパイルしている間、ランタイムオブジェクトはサブオブジェクトです。メソッドは実行時オブジェクトに対して呼び出されます。 –

+0

[抽象クラスのドキュメント](http://stackoverflow.com/documentation/java/87/inheritance/397/abstract-classes#t=20160916155332004042)を参照してください。 – Jonathan

+1

皆さん、ありがとうございます。したがって、ランタイムオブジェクトメソッドfooは、基本クラスメソッドfooではなく呼び出されるため、コンパイラはそれについて不平を言いません。 – MohsenFM

答えて

1

方法は、サブクラスによって実装されているかどうかをコンパイラが見えません。特定のクラス型参照によって呼び出されたメソッドがクラス自体に存在するかどうかをチェックするだけです。実行時に、呼び出すメソッドは、基本クラスバージョンまたはサブクラスバージョンを意味します。

あなたは「私の前提は、コンパイラがbオブジェクトを見て、それをベースオブジェクトとして見て、ベースからfooに移動する」ということです。

1

コンパイラはあまり処理しません。ここにあなたの場合 子クラスのオブジェクトを保持するスーパークラスとして参照変数を作成しました。

このメソッドを呼び出すと、オブジェクトタイプに基づいてサブクラスに存在するメソッドを直接呼び出しています。

参考のために私のコメントとともにコードを追加しています。

1)抽象クラスしか持たないメソッド宣言

public abstract class Base { public abstract Boolean foo(); //method declaration }

2)あなたはコンクリートなど、このクラスを宣言している場合は、メソッドを実装する必要があり、あなたの親クラスを拡張子クラスクラス。ここで

public class sub extends Base { @Override public Boolean foo() { System.out.printLn("This is foo in the sub class!"); } }

3)あなたは、子クラスのオブジェクトに

Base b = new sub();

4)と、この行を記憶しているあなたの親の型の参照変数を宣言しましたチェックコンパイラが実行される、オブジェクトの型は何か、オブジェクトの型に基づいてそのメソッドを呼び出す実行されます。これは、メソッドを呼び出すことはありません参照変数のype。

b.foo();

関連する問題