The question is definitely from K&B
I checked it, it is there in it and book definitely explains it quite clearly
let us examine line by line
<blockquote>
code:
<pre name="code" class="core">
class Mixer {</pre>
</blockquote>
class declaration
<blockquote>
code:
<pre name="code" class="core">
Mixer() { }
Mixer(Mixer m) { m1 = m; }</pre>
</blockquote>
overloaded constructores for class declarations
one is simple (like default constructor)
adn other is overloaded which gets an object reference of type Mixer and create a reference variable m1 refer to it
<blockquote>
code:
<pre name="code" class="core">
Mixer m1;</pre>
</blockquote>
the object reference declared which simply by default refers to nothing if object created with no reference passed
and if a object reference is passed then it refers to it
<blockquote>
code:
<pre name="code" class="core">
public static void main(String[] args) {</pre>
</blockquote>
start of main method
<blockquote>
code:
<pre name="code" class="core">
Mixer m2 = new Mixer();</pre>
</blockquote>
object reference m2 created refers to an object of type mixer that have a refence m1 as its instance variable which refers to nothing
<blockquote>
code:
<pre name="code" class="core">
Mixer m3 = new Mixer(m2);</pre>
</blockquote>
object reference m3 created refers to an object of type mixer that have a refence m1 as its instance variable which refers to
object passed to constructor <blockquote>
code:
<pre name="code" class="core">
m3.go();</pre>
</blockquote>
first hi is printed
<blockquote>
code:
<pre name="code" class="core">
Mixer m4 = m3.m1; \\ line 1</pre>
</blockquote>
an object reference m4 is created which refers to m1 same location referred by instance variable m1 of mixer object m3
<blockquote>
code:
<pre name="code" class="core">
m4.go();</pre>
</blockquote>
another his is printed , nothing is violated
<blockquote>
code:
<pre name="code" class="core">
Mixer m5 = m2.m1; \\ line 2</pre>
</blockquote>
m5 tends to refer to m1 instance variable (which is an object reference of type mixer but note that the object m2 is created with no parameter passed to constructor and hence its instance refence variable does not refer to anything(it's just declared ,not created yet by new keyword or some other mechanism) so it will throw an exception
<blockquote>
code:
<pre name="code" class="core">
m5.go();
}
void go() { System.out.print("hi "); }</pre>
</blockquote>
the go method
<blockquote>
code:
<pre name="code" class="core">
}</pre>
</blockquote>