2017-01-13 13 views
1

オーバーライドとオーバーロードに関するいくつかの原則を理解するのが難しいです。オーバーロードとオーバーライドによるJavaメソッドの選択

public class Figure{ 
    public void stampa(Figure f){ 
     System.out.println("Figure"); 
    } 
} 
public class Square extends Figure{ 
    public void stampa(Square q){ 
     System.out.println("Square"); 
    } 
} 
public class Rectangle extends Square{ 
    public void stampa(Rectangle r){ 
     System.out.println("Rectangle"); 
    } 
    public void stampa(Square r){ 
     System.out.println("Particular Rectangle"); 
    } 
    public void stampa(Figure f){ 
     System.out.println("Particular Figure"); 
    } 
} 

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

     Figure f1,f2; 
     Square q = new Rectangle(); 
     Rectangle r = new Rectangle(); 
     f1 = new Square(); 
     f2 = new Rectangle(); 

     f1.stampa(f2); //Figure 
     q.stampa(r); //Particular Rectangle 
     f1.stampa(q); //Figure 
     q.stampa(f1); //Particular Figure 
     q.stampa(q); //Particupar Rectangle 
    } 
} 

私はpublic void stampa(Square q)がそれをoverrding public void stampa(Figure f)をオーバーロードしていないことを知っています。

public void stampa(Rectangle r)およびpublic void stampa(Figure f)もまた、public void stampa(Square q)にオーバーロードされています。

また、Rectangleクラスのpublic void stampa(Square q)は、Squareクラスのメソッドをオーバーライドしています。

最初の質問

それがこの結果についてです:q.stampa(f1); //Particular Figure 私はコンパイル時にqはので、私はSquareクラスでこのメソッドpublic void stampa(Square q)を見ていきますSquareであることを知っています。そして実行時にqRectangleので、私が代わりに「特に図」の結果「とは、特定の長方形」かもしれないと思っている私がいる場合、間違った

2番目の質問

をやっている

わかりませんこの時点でRectangleFigureを拡張し、それ以上はSquareではありません。Square q = new Rectangle();にコンパイルエラーが発生しますqに何が起こるか(Square qなどの変数があるか、またはv私が間違っている場合、私の英語のために申し訳ありませんし、私を修正してください。

+0

*「第2の質問」* ...いいえ、投稿ごとに1つだけ、2つではありません。 – Tom

+0

あなたのクラスは 'Figura'と定義されています。これが単なるコピー&ペーストのタイプミスでない限り、これはいくつかの問題を引き起こすでしょう。 – kunruh

+0

@ kunruhありがとう、私はそれを修正しました – totoro

答えて

3

私はコンパイル時qで私は広場クラスでこのメソッドpublic void stampa(Square q)を見ていきますSquareであることを知っています。stampa(Square q)stampa(Figure f)

あなたはSquareがのメソッドが含まれていることを忘れています。後者はFigureから継承され、コンパイル時には が最も多く、 のみが適切なオーバーロードとして選択されます。

とランタイムqの矩形はので、私が考えた結果ではなく、「特に図」の「特別な長方形」であるかもしれない

オーバーロードは、コンパイル時に選択し、実行時に上書きされますされています。すでに述べたように、コンパイル時にstampa(Figure f)が選択されています。実際に呼び出されると、ランタイムはqRectangleのインスタンスであるとみなし、呼び出しをRectangle.stampa(Figure f)に委譲します。

2番目の質問については、私はあなたが何を求めているのか本当に理解していません。コンパイルエラーはコードが無効で何も起こらないことを意味します。 q.stampa(f1)は決して呼び出されず、結果を返すことはありません。

3

最初の質問:

q年代宣言された型は正方形です。 f1の宣言型はFigureです。したがって、Figureを受け入れるメソッド(または図のスーパークラス)が存在する場合、コンパイラはSquare Squareおよびそのスーパークラスの中で、stampaという名前のメソッドを探します。それは1つを見つけます図:public void stampa(Figure f)。コンパイル時に、変数の宣言された型が重要です。

実行時に、qが参照するオブジェクトの実際の実行時タイプが検査されます。これはRectangleです。そのため、ランタイムは、figureメソッド、Rectangle、およびすべてのスーパークラスをFigureまで上書きするメソッドpublic void stampa(Figure f)を探します。それが多形性を可能にするものです。それは長方形で見つかる:

public void stampa(Figure f) { 
    System.out.println("Particular Figure"); 
} 

2番目の質問:

あなたが実際にコンパイルエラーを持っていますので、変数qの種類についての推論は意味がありません:そのような変数は存在しません、コードはコンパイルされないので、クラスはコンパイラによって生成されないからです。

関連する問題