Logically equivalent code producing different results
<p>I have never encountered this sort of problem in Java before. All this code and the full project may be found at <a href="https://github.com/kb100/SimpleGame" rel="nofollow">my GitHub</a>. I have a <code>Snowflake</code> class with class hierarchy: </p>

<pre><code>Snowflake extends SolidRectangle extends Movable extends Drawable extends Object
</code></pre>

<p>The following two code sections in my <code>Snowflake</code> class produce different graphical results in my game:</p>

<pre><code>//In Snowflake class
public void decay()
{
    age++;
    color = randomSnowflakeColor();
    if(age == 5)
    {
        super.remove();
        Snowflake.Mempool.returnSnowflake(this);
    }
}
</code></pre>

<p>and</p>

<pre><code>//In Snowflake class
public void decay()
{
    age++;
    color = randomSnowflakeColor();
    if(age == 5)
    {
        this.remove();
    }

public void remove()
{
    super.remove();
    Snowflake.Mempool.returnSnowflake(this);
}
</code></pre>

<p>Neither <code>SolidRectangle</code> nor <code>Movable</code> overrides the <code>remove</code> method, but <code>Drawable</code> does, with the following implementation:</p>

<pre><code>//In Drawable class
public void remove()
{
    game.remove(this);
}
</code></pre>

<p>and <code>GameContent game</code> has the following implementation:</p>

<pre><code>//In GameContent class
public synchronized void remove(Drawable drawable)
{
    removeQueue.add(drawable);
}
</code></pre>

<p>I will spare you the details of <code>removeQueue</code>, suffice it to say that it is exactly what you expect.</p>

<p>As for <code>Snowflake.Mempool</code>, I know manual memory management isn't usually part of a Java programmer's day, but I found there was too much overhead in creating and garbage collecting these snowflakes, so I thought I would just reuse old snowflakes to avoid this overhead. Please don't get distracted by this. My question is about how the two first code blocks could possibly be different, when they appear to be functionally equivalent.</p>

<p>So, how can the two first code block be producing different results? </p>
