2016-09-30 6 views
0

私は、このようなように、既存のBufferedImageの上に画像を描画したいと思います:Java - キャスト結果のオブジェクトは、キャストされたオブジェクトと同じ参照値を持っていますか?

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

しかし、このインスタンス2つの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(); 

に等しいこと? (グラフィックスオブジェクトはCloneableではないので、これは上記のグラフィックスオブジェクトでは機能しません)

+1

を物事をクリアしていますそれは同じ参照ですので、あなたのアイデアは不要で、うまくいきません。 – shmosel

答えて

3

オブジェクトインスタンスとオブジェクト参照を混同していると思います。上記の例では、Graphicsオブジェクトのインスタンスが1つしかなく、2つの参照が割り当てられています。これは、Graphicsオブジェクトの2つの同一のインスタンスがメモリに保持されていることを意味するものではないため、そのオブジェクトを破棄する必要はありません。

このコード行は、基本的に同じオブジェクトに別のオブジェクト参照を追加するだけです。だから、gとg2の両方がメモリ内の同じオブジェクトを指しています。簡潔さのために

Graphics2D g2 = (Graphics2D) g

しかし、あなたは、同じオブジェクトへの第二の基準を割り当てるために必要とせずに、このようなあなたのコードを実装できます。

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

希望

関連する問題