在main方法的类中扩展Frame类

时间:2012-12-18 16:35:38

标签: java inheritance awt frame composition

今天当我阅读我的讲义时,我不明白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方法中创建Frame或在类QueenApl的实例变量中创建?{1}}?像这样:

    Frame someobj = new Frame(argument or none);
    
  2. 为什么可以直接使用getToolkit()而不在其前面附加classname.?是因为此方法在类Frame中,并且由于主方法类继承Frame,我们可以直接使用该方法吗?

3 个答案:

答案 0 :(得分:2)

extends是表示继承的关键字。

  

为什么main方法类扩展为Frame?框架为什么不是   在main方法内部创建或作为类的实例变量创建   QueenApl Frame something = new Frame(参数或无)?

不同之处在于你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方法,以实现狗特定的吃操作。

  

2.)顺便说一句,为什么可以直接使用getToolkit()而不附加类名。在它面前?是因为这个方法在课堂上   框架和自主方法类继承Frame,我们可以使用   方法直接?

好吧那是因为你的getToolKit()方法是从Frame clas继承的,所以你不需要用实例来调用它。

答案 1 :(得分:2)

你真的不需要扩展Frame,它只是方便。 将您的代码与不扩展Frame的代码进行比较。相反,您需要一个Frame字段。

调用setSize()和getToolkit()之类的方法现在需要以Frame字段作为前缀,因为不再是Frame。您的代码不需要它们,因为 this 是一个框架,您的类可以调用非私有祖先类的方法。

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

答案 2 :(得分:1)

它继承了JFrame,因此它可以覆盖paint方法,允许将图像“card”绘制到屏幕上。如果不重写paint方法,就无法访​​问要绘制到JFrame的图形对象。

paint方法附带一个java.awt.Graphics参数,它允许您绘制到JFrame。覆盖“paint”方法是获取Graphics类以绘制到JFrame的唯一方法。

“getToolkit”从JFrame继承,直接进入“QueenApl”类。因此,“getToolkit”现在在技术上是“QueenApl”类的成员。因此,在方法调用之前,不得附加任何成员/类名。

如果您在说“继承”或“延伸”时并不理解我的意思,请查看this