java - 为什么在paintComponent方法中将Graphics引用分配给Graphics2D引用变量时没有运行时错误?

标签 java polymorphism

我知道下面的分配会出现运行时错误,并且我知道原因:

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 Graphics2DGraphics的子类)。

当你这样做时:

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/

相关文章:

java - 是否可以使用 hibernate 注释持久化 List<E> ,其中 E 是一个接口(interface)?

java - 为什么我的对象不需要调用 .toString 方法?

types - 如何在 OCaml 中创建具有多个参数的类型?

java - 无法在 Swing 中水平显示 2 个 JTable

java - Eclipse 无法正确导出资源

java - 没有递归的置换算法? java

java - 如何创建空 map 并设置默认值

c++ - remove_if 无法识别虚拟类中的 operator()

c# - 不能在 C# 中的同一方法上使用虚拟和重写

c++ - 接口(interface)和多重继承