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,又因为main方法类继承Frame了,我们可以直接使用这个方法?

4

3 回答 3

2

您实际上不必扩展 Frame,它只是方便。将您的代码与不扩展 Frame 的代码进行比较。相反,您需要有一个 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);
  }   
}
于 2012-12-18T16:58:22.197 回答
2

extends是代表继承的关键字。

为什么 main 方法类扩展到 Frame ?为什么不在 main 方法中创建 Frame 或作为类 QueenApl 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 方法来实现特定于狗的吃操作。

2.)顺便说一下为什么可以直接使用getToolkit()而不附加类名。前面呢?是不是因为这个方法在Frame类中,而且主方法类继承了Frame,我们可以直接使用该方法?

那是因为您的getToolKit()方法是从您的 s 继承Frame clas的,因此您不需要使用实例调用它。

于 2012-12-18T16:39:01.683 回答
1

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

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

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

如果你不明白我所说的“继承”或“扩展”是什么意思,请看这个

于 2012-12-18T16:38:38.517 回答