我知道下面的分配会出现运行时错误,并且我知道原因:
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)
方法时,为什么没有 RuntimeError (毕竟 Graphics2D extends Graphics
) :
Graphics2D g2d = (Graphics2D)g;
是因为 g 中已经有 Graphics2D
引用吗?
最佳答案
这不是一个错误,因为正如你所说,g
实际上是一个由系统实例化的Graphics2D
对象(保留在ming Graphics2D
是Graphics
的子类)。
当你这样做时:
Sub sb = (Sub) new Super();
您正在明确创建父类(super class)的新对象。但是,当您这样做时:
Graphics2D g2d = (Graphics2D)g;
您不是在创建新的 Graphics2D 对象,而是转换已经是 Graphics2D
实例的现有对象。
在swing渲染的情况下,执行图形操作的对象是一个Graphics2D
对象,但是paintComponent()
接收一个Graphics
对象为了向后兼容。
关于java - 为什么在paintComponent方法中将Graphics引用分配给Graphics2D引用变量时没有运行时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23535526/