import java.awt.*; class DrawingPanel extends Panel{
public void paint(Graphics g){ g.draw3DRect(100,100,70,70,true);
} } public class Drawing{ private Frame f; private Panel p; public Drawing() { f = new Frame("Drawing a graphic"); p = new DrawingPanel(); f.add(p); f.setSize(200,200); f.setVisible(true); } public static void main(String[] args) { Drawing d = new Drawing();
class DrawingPanel extends Panel{
public void paint(Graphics g){
g.draw3DRect(100,100,70,70,true);
}
}
public class Drawing{
private Frame f;
private Panel p;
public Drawing()
{
f = new Frame("Drawing a graphic");
p = new DrawingPanel();
f.add(p);
f.setSize(200,200);
f.setVisible(true);
}
public static void main(String[] args)
{
Drawing d = new Drawing();
}
}只要new 一个Panel实例,就会自动调用其中的paint方法
最典型的回调函数当属 WinProc 刚然还有别的例如EnumWindowsProc而Java里的这种做法是不一样的,以Swing为例吧
比如JPanel里的paint地实现是来自于JComponent
里面又使用到了三个方法paintComponent, paintBorder, paintChildren
而这三个方法的又会调用其他的方法,而其他方法很可能由于不同的子类而不同。
这就是类的多态。
而调用paint方法的内在机理是和回调函数相似的。在Java中,要实现回调得最好办法是使用接口
这一点你再用 SAX 解析XML的时候就会深有感触。一家之言 :)
}
对象序列化接口没有任何方法,是怎么实现的