簡體   English   中英

在主要方法的類中擴展Frame類

[英]Extends Frame class in main method's class

今天,當我閱讀講義時,我不明白在這種情況下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. 為什么main方法類擴展了Frame類? 為什么沒有在main方法內部或作為QueenApl類的實例變量創建Frame 像這樣:

     Frame someobj = new Frame(argument or none); 
  2. 為什么可以直接使用getToolkit()而不附加classname. 在前面嗎? 是因為此方法在Frame類中並且由於主方法類繼承了Frame ,我們可以直接使用該方法?

extends是代表繼承的關鍵字。

為什么主方法類擴展到Frame? 為什么不在主方法內部或作為QueenApl類的實例變量創建Frame而不是某些東西= new Frame(argument或none)?

不同之處在於,當您extend Frame class時,會在您的類中獲取其方法。 即,您可以覆蓋QueenApl類的frame類中聲明的方法。

為了更好地理解,下面是一個著名的Animal示例:

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

請注意,您已經重寫了Dog類中的eat方法,以實現特定於dog的eat操作。

2)通過為什么可以直接使用getToolkit()而不附加類名的方式。 在前面嗎? 是因為此方法在Frame類中並且由於主方法類繼承了Frame,所以我們可以直接使用該方法?

好吧,因為您的getToolKit()方法是從Frame clas繼承的,因此您無需使用實例進行調用。

您實際上不必擴展Frame,這很方便。 將您的代碼與此不擴展框架的代碼進行比較。 相反,您需要具有“框架”字段。

像setSize()和getToolkit()這樣的調用方法現在需要在Frame字段前加上前綴,因為不再是Frame。 您的代碼不需要它們,因為是一個框架,您的類可以調用非私有祖先類的方法。

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);
  }   
}

它繼承了JFrame,因此可以覆蓋paint方法,從而將圖像“卡片”繪制到屏幕上。 如果不重寫paint方法,將無法訪問圖形對象以繪制到JFrame。

paint方法帶有java.awt.Graphics參數,該參數允許您繪制到JFrame。 覆蓋“ paint”方法是獲取Graphics類以繪制到JFrame的唯一方法。

“ getToolkit”是從JFrame繼承的,直接繼承到您的“ QueenApl”類中。 因此,“ getToolkit”從技術上講現在是“ QueenApl”類的成員。 因此,在方法調用之前,無需添加成員/類名。

如果你真的不明白我的意思,當我說“繼承”或“擴展”,看看這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM