繁体   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