我知道下面的赋值给出了运行时错误,我知道为什么:

Sub sb = (Sub) new Super();

public class Super {
    //class  members
}



public class Sub extends Super{
     //class members
}


但是,当我们重写javax.swng.JPanel的protected void paintComponent(Graphics g)方法(毕竟Graphics2D extends Graphics)时,为什么没有RuntimeError:

Graphics2D g2d = (Graphics2D)g;


是因为g已经有了Graphics2D引用了吗?

最佳答案

这不是一个错误,因为正如您所说,g实际上是由系统实例化的Graphics2D对象(保持Graphics2DGraphics的子类)。

当您这样做时:

Sub sb = (Sub) new Super();


您在显式地创建超类的新对象。但是,当您这样做时:

Graphics2D g2d = (Graphics2D)g;


您不是在创建新的Graphics2D对象,而是在投射一个已经为Graphics2D实例的现有对象。

对于挥杆渲染,执行图形操作的对象是Graphics2D对象,但是paintComponent()接收Graphics对象是为了向后兼容。

关于java - 在paintComponent方法中将Graphics引用分配给Graphics2D引用变量时,为什么没有运行时错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23535526/

10-10 02:54