Java - 强制转换产生的对象是否与强制转换的对象具有相同的引用值?

标签 java casting

我想将图像绘制到已经存在的 BufferedImage 上,如下所示:

    public static void drawImageOnTopOfOtherImage(BufferedImage a, BufferedImage b) {
        Graphics g = a.getGraphics();
        Graphics2D g2 = (Graphics2D) g;
        g2.drawImage(b);
    }

但是,此实例有两个 Graphics 对象:gg2。图形实例会占用大量内存,因此建议您在使用完它们后将其丢弃,以减少 RAM 使用量,如下所示:

    g.dispose();

对我来说,一开始做这样的事情很有意义:

    public static void drawImageOnTopOfOtherImage(BufferedImage a, BufferedImage b) {
        Graphics g = a.getGraphics();
        Graphics2D g2 = (Graphics2D) g;
        g.dispose();
        g2.drawImage(b);
        g2.dispose();
    }

但是,如果转换产生的对象与转换的对象具有相同的引用值,则这将不起作用。

所以,这是我的问题:强制转换产生的对象是否与强制转换的对象具有相同的引用值,使得

    TypeA a = (TypeA) b;

等于

    TypeA a = (TypeA) b.clone();

? (请注意,Graphics 对象不可Cloneable,因此上述内容不适用于 Graphics 对象)

最佳答案

我认为您将对象引用与对象实例混淆了。在上面的示例中,您只有一个 Graphics 对象的实例,并为其分配了两个引用。这并不意味着内存中保存有 2 个相同的 Graphics 对象实例,因此您无需担心如何处置它。

这行代码基本上只是添加对同一对象的另一个对象引用。所以现在 g 和 g2 都指向内存中的同一个对象。

Graphics2D g2 = (Graphics2D) g

为了简洁起见,您可以像这样实现代码,而无需为同一对象分配第二个引用:

public static void drawImageOnTopOfOtherImage(BufferedImage a, BufferedImage b) {
        Graphics2D g2 = (Graphics2D) a.getGraphics();
        g2.drawImage(b);
        g2.dispose();
}

希望事情能够解决

关于Java - 强制转换产生的对象是否与强制转换的对象具有相同的引用值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39800966/

相关文章:

c# - 使用辅助转换函数时的约定

ios - 使用自定义对象 ios 键入 Cast

java - 如何从 salesforce.com 调用 heroku java 应用程序?

java - 带有按钮的 Android Eclipse 弹出消息

java - Java 与 Clojure 的良好并发示例

sql-server - int 类型的算术溢出错误,值 = 4957500001.400178

c# - 我如何为我的类(class)提供定制类型转换支持?

java - 用于 Web 应用程序的一台服务器或两台服务器

java - 如何在java中将XLSX文件转换为带有字体格式的CSV

c++ - 将字节数组转换为 float