public class GamePanel extends JPanel 
{
MainFrame mainFrame;

private Image background = ImageUtil.getImage("images/background.jpg");

public GamePanel(MainFrame mainFrame) {
this.mainFrame = mainFrame;
// this.setPreferredSize(new Dimension())
}

public void paint(Graphics g) {
g.drawImage(this.background, 0, 0, this.getWidth(), 
this.getHeight() , null);
Piece currentPiece = this.mainFrame.getCurrentPiece();
ImageUtil.paintPiece(g, currentPiece);
Square[][] squares = this.mainFrame.getSquares();
if (squares == null) return;
for (int i = 0; i < squares.length; i++) {
for (int j = 0; j < squares[i].length; j++) {
Square s = squares[i][j];
if (s != null) {
g.drawImage(s.getImage(), s.getBeginX(), s.getBeginY(), this);
}
}
}
}}
这里是一个实现俄罗斯方块背景类,Graphics g 这是一个抽象对象,程序里g还调用了抽象方法g.drawImage,可是我知道抽象方法是没有实际功能的,我把这句注释掉,背景的显示就会出现白版,这就和“抽象方法是没有实际功能”发生矛盾了。这是什么原因呢?

解决方案 »

  1.   

    你是说给g赋值的是Graphics的子类,可是即使是这样也是Graphics类的对象呀,它的对象也不能用子类的方法。
      

  2.   

    你是说给g赋值的是Graphics的子类,可是即使是这样也是Graphics类的对象呀,它的对象也不能用子类的方法。
      

  3.   

    这是多态的表现,举个小例子abstract class Person {
    abstract void speak();
    }class Men extends Person{
    //子类必须实现父类的抽象方法
    void speak() {
    System.out.println("i'm a men");
    }
    }class Women extends Person{
    //子类必须实现父类的抽象方法
    void speak() {
    System.out.println("i'm a women");
    }
    }class Test{
    public void doSometing(Person p){
    p.speak();
    }

    public static void main(String[] args) {
    Test t = new Test();

    t.doSometing(new Men());
    }
    }
      

  4.   

    在运行时,jvm会调用你传入的实例的方法
      

  5.   

    public void paint(Graphics g) {
    这个方法是系统调用的,此时系统获取的g不是抽象的,而是Graphcis的非抽象子类的对象
    同样的,自己调用时
    paint(this.getGraphics()); //这里getGraphics()返回的也是非抽象子类的对象
    LZ想知道具体是什么对象,可以在paint方法中打印一下就知道了    public void paint(Graphics g) {
            System.out.println(g); //or System.out.println(g.getClass()) 调用这个查看具体是什么子类
            g.drawImage(this.background, 0, 0, this.getWidth(), 
                    this.getHeight() , null);
            Piece currentPiece = this.mainFrame.getCurrentPiece();
            ImageUtil.paintPiece(g, currentPiece);
            Square[][] squares = this.mainFrame.getSquares();
            if (squares == null) return;
            for (int i = 0; i < squares.length; i++) {
                for (int j = 0; j < squares[i].length; j++) {
                    Square s = squares[i][j];
                    if (s != null) {
                        g.drawImage(s.getImage(), s.getBeginX(), s.getBeginY(), this);
                    }
                }
            }
        }