首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java问题,来自C++程序员

Java问题,来自C++程序员
EN

Stack Overflow用户
提问于 2011-02-18 11:29:16
回答 3查看 87关注 0票数 2

我正在学习Java,现在我已经克服了包的波峰,一切都很顺利。我可以将我正在学习的大多数东西与我已经知道的东西进行比较,至少在概念上是相似的。但是下面这段代码到底是怎么回事呢?它是某种形式的构造函数,还是匿名对象?

代码语言:javascript
复制
Something obj = new Something()
{
  private static final int num = 3;

  public void meth()
  {
    // w/e
  }
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-18 12:10:20

代码语言:javascript
复制
/**
 * Notice there's only one thing in this that isn't defined:
 * It still needs public abstract void triggerEvent();
 */
public abstract static class TopButton extends JPanel implements MouseListener {
        protected ButtonPanel parent;
        private String text;
        public TopButton(ButtonPanel bp, String text) { parent = bp; this.text = text; addMouseListener(this); }
        public void mouseClicked(MouseEvent e) { triggerEvent(); }
        public void mouseEntered(MouseEvent e) { }
        public void mouseExited(MouseEvent e) { }
        public void mousePressed(MouseEvent e) { }
        public void mouseReleased(MouseEvent e) { }
        public abstract void triggerEvent();
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Color oldColor = g.getColor();
            Font oldFont = g.getFont();
                Font newFont = new Font(oldFont.getName(),oldFont.getStyle(),oldFont.getSize());
                g.setFont(newFont);
                g.setColor(Color.black);
                g.drawString(text, 20, 20);
            g.setFont(oldFont);
            g.setColor(oldColor);
        }
    }

现在,当我实际定义我的按钮时,我这样做。通过提供它所需要的一行代码,这是它与其他代码不同的唯一原因。现在,我可以为每个文件创建一个新文件,并为每个文件定义一个新类。这要简单得多。

代码语言:javascript
复制
private static void loadButtonPanelButtons() {
    /* This button should tell the parent to bring up the save screen */
    TopButton save = new TopButton(buttonPanel,"Save") {
        public void triggerEvent() { parent.triggerSave(); }
    };
    save.setBorder(LineBorder.createBlackLineBorder());
    buttonPanel.add(save);

    /* This button should tell the parent to bring up the load screen */
    TopButton load = new TopButton(buttonPanel,"Load") {
        public void triggerEvent() { parent.triggerLoad(); }
    };
    load.setBorder(LineBorder.createBlackLineBorder());
    buttonPanel.add(load);

    TopButton addTile = new TopButton(buttonPanel,"Add Tile") {
        public void triggerEvent() { parent.triggerAddTile(); }
    };
    addTile.setBorder(LineBorder.createBlackLineBorder());
    buttonPanel.add(addTile);

    TopButton saveTiles = new TopButton(buttonPanel,"Save Tiles") {
        public void triggerEvent() { parent.triggerStyleSave(); }
    };
    saveTiles.setBorder(LineBorder.createBlackLineBorder());
    buttonPanel.add(saveTiles);
}

现在,当我处理被按下的按钮时,回想一下TopButton的定义...有一次

代码语言:javascript
复制
    public void mouseClicked(MouseEvent e) { triggerEvent(); }

我们知道triggerEvent()最终会被定义。我们可以在每个按钮的基础上定义它,当面板被单击时,无论我们将triggerEvent()定义为什么,它都会被调用。

票数 2
EN

Stack Overflow用户

发布于 2011-02-18 11:30:59

你明白了--这会创建一个匿名的Something内部类。

另请参阅:Nested Classes (The Java Tutorial)Anonymous Classes

票数 6
EN

Stack Overflow用户

发布于 2011-02-18 11:54:16

这样的构造创建了一个类的匿名内部类,这个构造在其中被执行,并从某个东西(而不是某个东西的内部类)派生。

其思想是快速提供抽象类、接口或覆盖类的某些功能的实现。

(new Thread(){ public void run() {System.out.println(“在另一个线程上执行”);}}).start();

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5037337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档