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

时间:2011-02-18 03:29:16

标签: java class object

我正在学习Java,现在我已经超过了包裹驼峰,事情进展顺利。我可以用我已经知道的事物来学习大多数事物之间的相似之处,至少我已经知道了。但是接下来的代码究竟是怎么回事呢?它是某种形式的构造函数,还是匿名对象?

Something obj = new Something()
{
  private static final int num = 3;

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

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

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

现在,当我实际定义我的按钮时,我会这样做。通过提供它所需的一条线,唯一能使它与其他线不同的线。现在我可以为每个文件创建一个新文件,并为每个文件定义一个新类。这更简单。

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的定义......有

    public void mouseClicked(MouseEvent e) { triggerEvent(); }

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

答案 2 :(得分:1)

这样的构造创建了一个类的匿名内部类,在该类中执行此构造,并从Something(不是Something的内部类)派生。

我们的想法是快速提供抽象类,接口或覆盖类的某些功能的实现。

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