我想将图像绘制到已经存在的 BufferedImage 上,如下所示:
public static void drawImageOnTopOfOtherImage(BufferedImage a, BufferedImage b) {
Graphics g = a.getGraphics();
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(b);
}
但是,此实例有两个 Graphics 对象:g
和 g2
。图形实例会占用大量内存,因此建议您在使用完它们后将其丢弃,以减少 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/