2012-12-18 55 views
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. 为什么main方法类扩展Frame类?为什么在主要方法内部不创建Frame或作为类QueenApl的实例变量?就像这样:

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

+2

不,不,不,不延长JFrame的,一切都如此简单,错误 – mKorbel

+0

我试着google一下为什么延长JFrame的是用于显示图像放的JPanel到JFrame的一个很大的错误太 – caramel1995

+0

,覆盖JPanel的PreferredSize并使用paintComponent而不是paint – mKorbel

回答

1

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

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

“getToolkit”从JFrame继承,直接到你的“QueenApl”类中。正因为如此,“getToolkit”现在在技术上是“QueenApl”类的成员。因此,在方法调用之前,不得添加成员/类名称。

如果我在说“继承”或“扩展”时不太明白我的意思,请查看this

2

extends是代表继承性的关键字。

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

不同之处在于你在课堂上获得了它的方法extend Frame class。即可以覆盖QueenApl类中框架类中声明的方法。

为了更好地理解这里有一个在著名Animal例如:

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

请注意,您已经覆盖在狗类的吃的方法来实现特定的狗吃的操作。

2.)顺便说一句,为什么可以直接使用getToolkit()而不需要追加类名。在它前面?是因为这个方法是在类 中的框架,并且由于主要方法类继承了Frame,我们可以直接使用 方法吗?

好那是因为你的getToolKit()方法是从你的Frame clas小号继承,因此你不需要用一个实例来调用它。

+0

为什么不创建额外的类来继承框架并重写该类中的特定方法并在主方法内创建该类的对象? – caramel1995

+0

@ caramel1995抱歉,我不知道你在那里,如果你问为什么你需要继承?好吧,因为你需要对你的物体进行文化。在我的例子中,动物可以是任何东西,狗,猫,羊... – PermGenError

+0

@ caramel1995它继承它,因此它可以覆盖“绘画”。 – Aaron

2

你并不需要扩展Frame,这很方便。 将您的代码与不扩展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); 
    } 
} 
+0

如果班级没有派生框架,图像如何绘制? – Aaron

+0

构造函数的最后一行:frame.show()绘制所有内容 – NickJ

+0

如何在没有继承JFrame的情况下执行重写的“paint”操作? – Aaron