我正在学习Java,现在我已经克服了包的波峰,一切都很顺利。我可以将我正在学习的大多数东西与我已经知道的东西进行比较,至少在概念上是相似的。但是下面这段代码到底是怎么回事呢?它是某种形式的构造函数,还是匿名对象?
Something obj = new Something()
{
private static final int num = 3;
public void meth()
{
// w/e
}
};发布于 2011-02-18 12:10:20
/**
* 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()定义为什么,它都会被调用。
发布于 2011-02-18 11:30:59
你明白了--这会创建一个匿名的Something内部类。
另请参阅:Nested Classes (The Java Tutorial)和Anonymous Classes。
发布于 2011-02-18 11:54:16
这样的构造创建了一个类的匿名内部类,这个构造在其中被执行,并从某个东西(而不是某个东西的内部类)派生。
其思想是快速提供抽象类、接口或覆盖类的某些功能的实现。
(new Thread(){ public void run() {System.out.println(“在另一个线程上执行”);}}).start();
https://stackoverflow.com/questions/5037337
复制相似问题