Java - 转换产生的对象与转换对象具有相同的引用值吗?

时间:2016-09-30 22:28:35

标签: 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对象)

1 个答案:

答案 0 :(得分:3)

我认为你将对象引用与对象实例混淆。在上面的示例中,您只有一个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();
}

希望能够解决问题