我知道下面的赋值给出了运行时错误,我知道为什么:
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
对象(保持Graphics2D
是Graphics
的子类)。
当您这样做时:
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/