2016-09-30 44 views
0

我想提请图像上已经存在的BufferedImage,像这样的:Java - 铸造产生的对象是否具有与铸造对象相同的参考值?

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

然而,这种情况下,两个图形对象,gg2。图形实例占用了大量的内存,所以建议你处理掉您使用它们来减少内存使用完毕后,像这样的:

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(); 

? (请注意,图形对象不是Cloneable,所以这对于图形对象不起作用)

+1

这是相同的参考,所以你的想法是不必要的,不会工作。 – shmosel

回答

3

我认为你让对象引用与对象实例混淆。在上面的例子中,你只有一个Graphics对象的实例,并且已经为它分配了两个引用。这并不意味着在内存中有两个相同的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(); 
} 

。希望清除的东西了