2

extends今日、講義ノートを読んでいたとき、このコンテキストでの目的が何であるかがわかりません。次のコードを検討してください。

import java.net.*;    
import java.awt.*;

public class QueenApl extends Frame{ // Why extends??
  Image card;

public static void main(String[] args){
    QueenApl f = new QueenApl();
    f.show();    
}

public QueenApl(){
    setSize(400,400);
    try{
      URL u = new URL("file:/c:/windows/desktop/carn4.jpg");
      card=getToolkit().getImage(u); //Why getToolkit can be used directly?
    }catch(MalformedURLException e){
     System.out.println("Error in URL!"); System.exit(1);
    }  
}

public void paint(Graphics g){
      g.drawImage(card,120,50,this);
    }   
}
  1. メイン メソッド クラスがクラスを拡張するのはなぜFrameですか? Framemain メソッド内または class のインスタンス変数として作成されないのはなぜQueenAplですか? このような:

    Frame someobj = new Frame(argument or none);
    
  2. 前にgetToolkit()を追加せずに直接使用できるのはなぜですか? classname.このメソッドがクラスFrameにあり、メイン メソッド クラスが継承しFrameているため、メソッドを直接使用できるためでしょうか。

4

3 に答える 3

2

フレームを拡張する必要はありません。便利です。コードを、Frameを拡張しないこのコードと比較してください。代わりに、フレームフィールドが必要です。

setSize()やgetToolkit()などの呼び出しメソッドは、フレームフィールドではなくなったため、フレームフィールドのプレフィックスを付ける必要があります。これはフレームであるため、コードはそれらを必要としません。非プライベートの祖先クラスのメソッドは、クラスから呼び出すことができます。

import java.net.*;    
import java.awt.*;

public class QueenApl { 
  Image card;
  Frame frame;

  public static void main(String[] args){
      QueenApl f = new QueenApl();
  }

  public QueenApl(){
    frame = new Frame();
    frame.setSize(400,400);
    try{
      URL u = new URL("file:/c:/windows/desktop/carn4.jpg");
      card=frame.getToolkit().getImage(u);
    } catch(MalformedURLException e){
      System.out.println("Error in URL!"); System.exit(1);
    } 
    frame.show();
  }

  public void paint(Graphics g){
    g.drawImage(card,120,50,frame);
  }   
}
于 2012-12-18T16:58:22.197 に答える
2

extends継承を表すキーワードです。

メインメソッドクラスがFrameに拡張されるのはなぜですか?メインメソッド内で、またはクラスQueenApl Frameのインスタンス変数としてFrameを作成しないのはなぜですか?something = new Frame(argument or none)?

extend Frame class違いは、クラスでメソッドを取得するときです。つまり、QueenAplクラスのフレームクラスで宣言されたメソッドをオーバーライドできます。

理解を深めるために、悪名高いAnimal例を次に示します。

class Animal {
public void eat(){
//animal eat
}
class Dog extends Animal {
@override 
public void eat(){
//dog specific eat
}
}
}

Dogクラスのeatメソッドをオーバーライドして、犬固有のeat操作を実装していることに注意してください。

2.)ちなみに、クラス名を追加せずにgetToolkit()を直接使用できるのはなぜですか。その前に?このメソッドはFrameクラスにあり、メインメソッドクラスはFrameを継承しているため、メソッドを直接使用できますか?

これは、getToolKit()メソッドがsから継承されてFrame clasいるため、インスタンスを使用して呼び出す必要がないためです。

于 2012-12-18T16:39:01.683 に答える
1

JFrame を継承しているため、paint メソッドをオーバーライドして、画像の「カード」を画面に描画できます。paint メソッドをオーバーライドしないと、グラフィックス オブジェクトにアクセスして JFrame に描画する方法がありません。

paint メソッドには、JFrame への描画を可能にする java.awt.Graphics パラメータが付属しています。「ペイント」メソッドをオーバーライドすることが、JFrame に描画する Graphics クラスを取得できる唯一の手段です。

「getToolkit」は、JFrame から「QueenApl」クラスに直接継承されます。このため、「getToolkit」は技術的に「QueenApl」クラスのメンバーになりました。したがって、メソッド呼び出しの前にメンバー/クラス名を追加する必要はありません。

「継承」または「拡張」という言葉の意味がよくわからない場合は、これを見てください。

于 2012-12-18T16:38:38.517 に答える