<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FClass%2FInner_Class</id>
		<title>Java/Class/Inner Class - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FClass%2FInner_Class"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Class/Inner_Class&amp;action=history"/>
		<updated>2026-04-21T11:27:01Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Class/Inner_Class&amp;diff=7157&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Class/Inner_Class&amp;diff=7157&amp;oldid=prev"/>
				<updated>2010-06-01T06:36:13Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:36, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Class/Inner_Class&amp;diff=7156&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Class/Inner_Class&amp;diff=7156&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:44Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Accessing its enclosing instance from an inner class ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
public class Main {&lt;br /&gt;
  private int number = 12;&lt;br /&gt;
  public Main() {&lt;br /&gt;
    InnerClass inner = new InnerClass();&lt;br /&gt;
    inner.printNumber();&lt;br /&gt;
  }&lt;br /&gt;
  class InnerClass {&lt;br /&gt;
    public void printNumber() {&lt;br /&gt;
      System.out.println(Main.this.number);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    new Main();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== A named inner class is used to ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/** Demonstrate inner-inner class. A named inner class&lt;br /&gt;
 * is used to show that it can access non-local variables&lt;br /&gt;
 * in the enclosing object.&lt;br /&gt;
 */&lt;br /&gt;
public class InnerClass3 {&lt;br /&gt;
  static String msg = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
  public static void main(String[] av) {&lt;br /&gt;
    class Inner {&lt;br /&gt;
      public void doTheWork() {&lt;br /&gt;
        // print member of enclosing class&lt;br /&gt;
        System.out.println(msg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    Inner p = new Inner();&lt;br /&gt;
    p.doTheWork();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== An inner class cannot be overriden like a method ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// : c08:BigEgg.java&lt;br /&gt;
// An inner class cannot be overriden like a method.&lt;br /&gt;
// From &amp;quot;Thinking in Java, 3rd ed.&amp;quot; (c) Bruce Eckel 2002&lt;br /&gt;
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.&lt;br /&gt;
class Egg {&lt;br /&gt;
  private Yolk y;&lt;br /&gt;
  protected class Yolk {&lt;br /&gt;
    public Yolk() {&lt;br /&gt;
      System.out.println(&amp;quot;Egg.Yolk()&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public Egg() {&lt;br /&gt;
    System.out.println(&amp;quot;New Egg()&amp;quot;);&lt;br /&gt;
    y = new Yolk();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class BigEgg extends Egg {&lt;br /&gt;
  public class Yolk {&lt;br /&gt;
    public Yolk() {&lt;br /&gt;
      System.out.println(&amp;quot;BigEgg.Yolk()&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    new BigEgg();&lt;br /&gt;
  }&lt;br /&gt;
} ///:~&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiler will generate a synthetic constructor since SyntheticConstructor() is private ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 *&lt;br /&gt;
 *   - Redistributions of source code must retain the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 *&lt;br /&gt;
 *   - Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *     documentation and/or other materials provided with the distribution.&lt;br /&gt;
 *&lt;br /&gt;
 *   - Neither the name of Sun Microsystems nor the names of its&lt;br /&gt;
 *     contributors may be used to endorse or promote products derived&lt;br /&gt;
 *     from this software without specific prior written permission.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS&lt;br /&gt;
 * IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR&lt;br /&gt;
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,&lt;br /&gt;
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR&lt;br /&gt;
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF&lt;br /&gt;
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING&lt;br /&gt;
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS&lt;br /&gt;
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
public class SyntheticConstructor {&lt;br /&gt;
  private SyntheticConstructor() {&lt;br /&gt;
  }&lt;br /&gt;
  class Inner {&lt;br /&gt;
    // Compiler will generate a synthetic constructor since&lt;br /&gt;
    // SyntheticConstructor() is private.&lt;br /&gt;
    Inner() {&lt;br /&gt;
      new SyntheticConstructor();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating a constructor for an anonymous inner class ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// : c08:AnonymousConstructor.java&lt;br /&gt;
// Creating a constructor for an anonymous inner class.&lt;br /&gt;
// From &amp;quot;Thinking in Java, 3rd ed.&amp;quot; (c) Bruce Eckel 2002&lt;br /&gt;
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.&lt;br /&gt;
abstract class Base {&lt;br /&gt;
  public Base(int i) {&lt;br /&gt;
    System.out.println(&amp;quot;Base constructor, i = &amp;quot; + i);&lt;br /&gt;
  }&lt;br /&gt;
  public abstract void f();&lt;br /&gt;
}&lt;br /&gt;
public class AnonymousConstructor {&lt;br /&gt;
  public static Base getBase(int i) {&lt;br /&gt;
    return new Base(i) {&lt;br /&gt;
      {&lt;br /&gt;
        System.out.println(&amp;quot;Inside instance initializer&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      public void f() {&lt;br /&gt;
        System.out.println(&amp;quot;In anonymous f()&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    Base base = getBase(47);&lt;br /&gt;
    base.f();&lt;br /&gt;
  }&lt;br /&gt;
} ///:~&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating inner classes ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// : c08:Parcel1.java&lt;br /&gt;
// Creating inner classes.&lt;br /&gt;
// From &amp;quot;Thinking in Java, 3rd ed.&amp;quot; (c) Bruce Eckel 2002&lt;br /&gt;
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.&lt;br /&gt;
public class Parcel1 {&lt;br /&gt;
  class Contents {&lt;br /&gt;
    private int i = 11;&lt;br /&gt;
    public int value() {&lt;br /&gt;
      return i;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  class Destination {&lt;br /&gt;
    private String label;&lt;br /&gt;
    Destination(String whereTo) {&lt;br /&gt;
      label = whereTo;&lt;br /&gt;
    }&lt;br /&gt;
    String readLabel() {&lt;br /&gt;
      return label;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  // Using inner classes looks just like&lt;br /&gt;
  // using any other class, within Parcel1:&lt;br /&gt;
  public void ship(String dest) {&lt;br /&gt;
    Contents c = new Contents();&lt;br /&gt;
    Destination d = new Destination(dest);&lt;br /&gt;
    System.out.println(d.readLabel());&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    Parcel1 p = new Parcel1();&lt;br /&gt;
    p.ship(&amp;quot;Tanzania&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
} ///:~&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating instances of inner classes ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// : c08:Parcel11.java&lt;br /&gt;
// Creating instances of inner classes.&lt;br /&gt;
// From &amp;quot;Thinking in Java, 3rd ed.&amp;quot; (c) Bruce Eckel 2002&lt;br /&gt;
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.&lt;br /&gt;
public class Parcel11 {&lt;br /&gt;
  class Contents {&lt;br /&gt;
    private int i = 11;&lt;br /&gt;
    public int value() {&lt;br /&gt;
      return i;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  class Destination {&lt;br /&gt;
    private String label;&lt;br /&gt;
    Destination(String whereTo) {&lt;br /&gt;
      label = whereTo;&lt;br /&gt;
    }&lt;br /&gt;
    String readLabel() {&lt;br /&gt;
      return label;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    Parcel11 p = new Parcel11();&lt;br /&gt;
    // Must use instance of outer class&lt;br /&gt;
    // to create an instances of the inner class:&lt;br /&gt;
    Parcel11.Contents c = p.new Contents();&lt;br /&gt;
    Parcel11.Destination d = p.new Destination(&amp;quot;Tanzania&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
} ///:~&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Demonstrate an Inner Child class ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002.&lt;br /&gt;
 * All rights reserved. Software written by Ian F. Darwin and others.&lt;br /&gt;
 * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 * 1. Redistributions of source code must retain the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 * 2. Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *    documentation and/or other materials provided with the distribution.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS&amp;quot;&amp;quot;&lt;br /&gt;
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED&lt;br /&gt;
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS&lt;br /&gt;
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR&lt;br /&gt;
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF&lt;br /&gt;
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS&lt;br /&gt;
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;br /&gt;
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)&lt;br /&gt;
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 * &lt;br /&gt;
 * Java, the Duke mascot, and all variants of Sun&amp;quot;s Java &amp;quot;steaming coffee&lt;br /&gt;
 * cup&amp;quot; logo are trademarks of Sun Microsystems. Sun&amp;quot;s, and James Gosling&amp;quot;s,&lt;br /&gt;
 * pioneering role in inventing and promulgating (and standardizing) the Java &lt;br /&gt;
 * language and environment is gratefully acknowledged.&lt;br /&gt;
 * &lt;br /&gt;
 * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&amp;amp;T, for&lt;br /&gt;
 * inventing predecessor languages C and C++ is also gratefully acknowledged.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Demonstrate an Inner Child class&lt;br /&gt;
 * @author Ian F. Darwin, http://www.darwinsys.ru/&lt;br /&gt;
 * @version $Id: InnerChild.java,v 1.3 2004/02/09 03:33:53 ian Exp $&lt;br /&gt;
 */&lt;br /&gt;
public class InnerChild {&lt;br /&gt;
  public class InnerInnerChild extends InnerChild {&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] argv) {&lt;br /&gt;
    // System.out.println(new InnerChild.InnerInnerChild()); // NOT how!&lt;br /&gt;
    InnerChild x = new InnerChild();&lt;br /&gt;
    System.out.println(x.new InnerInnerChild());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Demonstrate simple inner class ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/** Demonstrate simple inner class. A named inner class&lt;br /&gt;
 * is used to show that it can access non-local variables&lt;br /&gt;
 * in the enclosing object.&lt;br /&gt;
 */&lt;br /&gt;
public class InnerClass1 {&lt;br /&gt;
  String msg = &amp;quot;Hello&amp;quot;;&lt;br /&gt;
  void doWork() {&lt;br /&gt;
    Inner i = new Inner();&lt;br /&gt;
    i.doTheWork();&lt;br /&gt;
    msg = &amp;quot;Goodbye&amp;quot;;&lt;br /&gt;
    i.doTheWork();&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] av) {&lt;br /&gt;
    InnerClass1 p = new InnerClass1();&lt;br /&gt;
    p.doWork();&lt;br /&gt;
  }&lt;br /&gt;
  class Inner {&lt;br /&gt;
    public void doTheWork() {&lt;br /&gt;
      // print member of enclosing class&lt;br /&gt;
      System.out.println(msg);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Holds a sequence of Objects ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// : c08:LocalInnerClass.java&lt;br /&gt;
// Holds a sequence of Objects.&lt;br /&gt;
// From &amp;quot;Thinking in Java, 3rd ed.&amp;quot; (c) Bruce Eckel 2002&lt;br /&gt;
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.&lt;br /&gt;
interface Counter {&lt;br /&gt;
  int next();&lt;br /&gt;
}&lt;br /&gt;
public class LocalInnerClass {&lt;br /&gt;
  private int count = 0;&lt;br /&gt;
  Counter getCounter(final String name) {&lt;br /&gt;
    // A local inner class:&lt;br /&gt;
    class LocalCounter implements Counter {&lt;br /&gt;
      public LocalCounter() {&lt;br /&gt;
        // Local inner class can have a constructor&lt;br /&gt;
        System.out.println(&amp;quot;LocalCounter()&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      public int next() {&lt;br /&gt;
        System.out.print(name); // Access local final&lt;br /&gt;
        return count++;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return new LocalCounter();&lt;br /&gt;
  }&lt;br /&gt;
  // The same thing with an anonymous inner class:&lt;br /&gt;
  Counter getCounter2(final String name) {&lt;br /&gt;
    return new Counter() {&lt;br /&gt;
      // Anonymous inner class cannot have a named&lt;br /&gt;
      // constructor, only an instance initializer:&lt;br /&gt;
      {&lt;br /&gt;
        System.out.println(&amp;quot;Counter()&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      public int next() {&lt;br /&gt;
        System.out.print(name); // Access local final&lt;br /&gt;
        return count++;&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    LocalInnerClass lic = new LocalInnerClass();&lt;br /&gt;
    Counter c1 = lic.getCounter(&amp;quot;Local inner &amp;quot;), c2 = lic&lt;br /&gt;
        .getCounter2(&amp;quot;Anonymous inner &amp;quot;);&lt;br /&gt;
    for (int i = 0; i &amp;lt; 5; i++)&lt;br /&gt;
      System.out.println(c1.next());&lt;br /&gt;
    for (int i = 0; i &amp;lt; 5; i++)&lt;br /&gt;
      System.out.println(c2.next());&lt;br /&gt;
  }&lt;br /&gt;
} ///:~&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Inheriting an inner class ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// : c08:InheritInner.java&lt;br /&gt;
// Inheriting an inner class.&lt;br /&gt;
// From &amp;quot;Thinking in Java, 3rd ed.&amp;quot; (c) Bruce Eckel 2002&lt;br /&gt;
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.&lt;br /&gt;
class WithInner {&lt;br /&gt;
  class Inner {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class InheritInner extends WithInner.Inner {&lt;br /&gt;
  //! InheritInner() {} // Won&amp;quot;t compile&lt;br /&gt;
  InheritInner(WithInner wi) {&lt;br /&gt;
    wi.super();&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    WithInner wi = new WithInner();&lt;br /&gt;
    InheritInner ii = new InheritInner(wi);&lt;br /&gt;
  }&lt;br /&gt;
} ///:~&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Just to show that there is no such thing as inner methods in Java ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/** Just to show that there is no such thing as inner methods in Java */&lt;br /&gt;
public class InnerMethods {&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    new InnerMethods().work();&lt;br /&gt;
  }&lt;br /&gt;
  public void work() {  // EXPECT COMPILE ERROR&lt;br /&gt;
    void inner() {&lt;br /&gt;
      System.out.println(&amp;quot;Hey, there is such a thing as Inner Methods&amp;quot;);&lt;br /&gt;
      System.out.println(&amp;quot;in Java. Better tell James Gosling and Sun!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    inner();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nested classes can access all members of all levels of the classes they are nested within ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// : c08:MultiNestingAccess.java&lt;br /&gt;
// Nested classes can access all members of all levels of the classes they are nested within.&lt;br /&gt;
// From &amp;quot;Thinking in Java, 3rd ed.&amp;quot; (c) Bruce Eckel 2002&lt;br /&gt;
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.&lt;br /&gt;
&lt;br /&gt;
public class MultiNestingAccess {&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    MNA mna = new MNA();&lt;br /&gt;
    MNA.A mnaa = mna.new A();&lt;br /&gt;
    MNA.A.B mnaab = mnaa.new B();&lt;br /&gt;
    mnaab.h();&lt;br /&gt;
  }&lt;br /&gt;
} ///:~&lt;br /&gt;
class MNA {&lt;br /&gt;
  private void f() {&lt;br /&gt;
  }&lt;br /&gt;
  class A {&lt;br /&gt;
    private void g() {&lt;br /&gt;
    }&lt;br /&gt;
    public class B {&lt;br /&gt;
      void h() {&lt;br /&gt;
        g();&lt;br /&gt;
        f();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nested Class Static ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
public class NestedClassStatic {&lt;br /&gt;
  /** Just show that Nested Classes may be static */&lt;br /&gt;
  static class V {&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    V v = new V();&lt;br /&gt;
    System.out.println(v);&lt;br /&gt;
    v = new V();&lt;br /&gt;
    System.out.println(v);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nesting a class within a scope ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// : c08:Parcel5.java&lt;br /&gt;
// Nesting a class within a scope.&lt;br /&gt;
// From &amp;quot;Thinking in Java, 3rd ed.&amp;quot; (c) Bruce Eckel 2002&lt;br /&gt;
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.&lt;br /&gt;
public class Parcel5 {&lt;br /&gt;
  private void internalTracking(boolean b) {&lt;br /&gt;
    if (b) {&lt;br /&gt;
      class TrackingSlip {&lt;br /&gt;
        private String id;&lt;br /&gt;
        TrackingSlip(String s) {&lt;br /&gt;
          id = s;&lt;br /&gt;
        }&lt;br /&gt;
        String getSlip() {&lt;br /&gt;
          return id;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      TrackingSlip ts = new TrackingSlip(&amp;quot;slip&amp;quot;);&lt;br /&gt;
      String s = ts.getSlip();&lt;br /&gt;
    }&lt;br /&gt;
    // Can&amp;quot;t use it here! Out of scope:&lt;br /&gt;
    //! TrackingSlip ts = new TrackingSlip(&amp;quot;x&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public void track() {&lt;br /&gt;
    internalTracking(true);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    Parcel5 p = new Parcel5();&lt;br /&gt;
    p.track();&lt;br /&gt;
  }&lt;br /&gt;
} ///:~&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Proper inheritance of an inner class ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// : c08:BigEgg2.java&lt;br /&gt;
// Proper inheritance of an inner class.&lt;br /&gt;
// From &amp;quot;Thinking in Java, 3rd ed.&amp;quot; (c) Bruce Eckel 2002&lt;br /&gt;
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.&lt;br /&gt;
class Egg2 {&lt;br /&gt;
  protected class Yolk {&lt;br /&gt;
    public Yolk() {&lt;br /&gt;
      System.out.println(&amp;quot;Egg2.Yolk()&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void f() {&lt;br /&gt;
      System.out.println(&amp;quot;Egg2.Yolk.f()&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private Yolk y = new Yolk();&lt;br /&gt;
  public Egg2() {&lt;br /&gt;
    System.out.println(&amp;quot;New Egg2()&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public void insertYolk(Yolk yy) {&lt;br /&gt;
    y = yy;&lt;br /&gt;
  }&lt;br /&gt;
  public void g() {&lt;br /&gt;
    y.f();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class BigEgg2 extends Egg2 {&lt;br /&gt;
  public class Yolk extends Egg2.Yolk {&lt;br /&gt;
    public Yolk() {&lt;br /&gt;
      System.out.println(&amp;quot;BigEgg2.Yolk()&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void f() {&lt;br /&gt;
      System.out.println(&amp;quot;BigEgg2.Yolk.f()&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public BigEgg2() {&lt;br /&gt;
    insertYolk(new Yolk());&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    Egg2 e2 = new BigEgg2();&lt;br /&gt;
    e2.g();&lt;br /&gt;
  }&lt;br /&gt;
} ///:~&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Putting test code in a nested class ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// : c08:TestBed.java&lt;br /&gt;
// Putting test code in a nested class.&lt;br /&gt;
// From &amp;quot;Thinking in Java, 3rd ed.&amp;quot; (c) Bruce Eckel 2002&lt;br /&gt;
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.&lt;br /&gt;
public class TestBed {&lt;br /&gt;
  public TestBed() {&lt;br /&gt;
  }&lt;br /&gt;
  public void f() {&lt;br /&gt;
    System.out.println(&amp;quot;f()&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public static class Tester {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
      TestBed t = new TestBed();&lt;br /&gt;
      t.f();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
} ///:~&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Returning a reference to an inner class ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// : c08:Parcel2.java&lt;br /&gt;
// Returning a reference to an inner class.&lt;br /&gt;
// From &amp;quot;Thinking in Java, 3rd ed.&amp;quot; (c) Bruce Eckel 2002&lt;br /&gt;
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.&lt;br /&gt;
public class Parcel2 {&lt;br /&gt;
  class Contents {&lt;br /&gt;
    private int i = 11;&lt;br /&gt;
    public int value() {&lt;br /&gt;
      return i;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  class Destination {&lt;br /&gt;
    private String label;&lt;br /&gt;
    Destination(String whereTo) {&lt;br /&gt;
      label = whereTo;&lt;br /&gt;
    }&lt;br /&gt;
    String readLabel() {&lt;br /&gt;
      return label;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public Destination to(String s) {&lt;br /&gt;
    return new Destination(s);&lt;br /&gt;
  }&lt;br /&gt;
  public Contents cont() {&lt;br /&gt;
    return new Contents();&lt;br /&gt;
  }&lt;br /&gt;
  public void ship(String dest) {&lt;br /&gt;
    Contents c = cont();&lt;br /&gt;
    Destination d = to(dest);&lt;br /&gt;
    System.out.println(d.readLabel());&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    Parcel2 p = new Parcel2();&lt;br /&gt;
    p.ship(&amp;quot;Tanzania&amp;quot;);&lt;br /&gt;
    Parcel2 q = new Parcel2();&lt;br /&gt;
    // Defining references to inner classes:&lt;br /&gt;
    Parcel2.Contents c = q.cont();&lt;br /&gt;
    Parcel2.Destination d = q.to(&amp;quot;Borneo&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
} ///:~&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== This file is to show what happens if you try to access an inner class created in another class ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002.&lt;br /&gt;
 * All rights reserved. Software written by Ian F. Darwin and others.&lt;br /&gt;
 * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 * 1. Redistributions of source code must retain the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 * 2. Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *    documentation and/or other materials provided with the distribution.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS&amp;quot;&amp;quot;&lt;br /&gt;
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED&lt;br /&gt;
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS&lt;br /&gt;
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR&lt;br /&gt;
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF&lt;br /&gt;
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS&lt;br /&gt;
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN&lt;br /&gt;
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)&lt;br /&gt;
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE&lt;br /&gt;
 * POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 * &lt;br /&gt;
 * Java, the Duke mascot, and all variants of Sun&amp;quot;s Java &amp;quot;steaming coffee&lt;br /&gt;
 * cup&amp;quot; logo are trademarks of Sun Microsystems. Sun&amp;quot;s, and James Gosling&amp;quot;s,&lt;br /&gt;
 * pioneering role in inventing and promulgating (and standardizing) the Java &lt;br /&gt;
 * language and environment is gratefully acknowledged.&lt;br /&gt;
 * &lt;br /&gt;
 * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&amp;amp;T, for&lt;br /&gt;
 * inventing predecessor languages C and C++ is also gratefully acknowledged.&lt;br /&gt;
 */&lt;br /&gt;
import java.awt.event.*;&lt;br /&gt;
// This file is to show what happens if you try to access an inner class&lt;br /&gt;
// created in another class. Here we try to steal ButtonDemo2.java&amp;quot;s&lt;br /&gt;
// inner class named MyActionListener. You will find that you can&amp;quot;t,&lt;br /&gt;
// since it has no visible constructor!&lt;br /&gt;
class ButtonDemo2 {&lt;br /&gt;
  // Create an inner class which may be named ButtonDemo2$1&lt;br /&gt;
  Object o = new ActionListener() {&lt;br /&gt;
      public void actionPerformed(ActionEvent evt) {&lt;br /&gt;
      }&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
public class TryStealingInnerClass {&lt;br /&gt;
  public static void main(String[] a) {&lt;br /&gt;
    new TryStealingInnerClass().doIt();&lt;br /&gt;
  }&lt;br /&gt;
  public void doIt() {&lt;br /&gt;
    Object o = new ButtonDemo2$1$();  // EXPECT COMPILE ERROR&lt;br /&gt;
    System.out.println(o.toString());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Using inner classes for callbacks ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// : c08:Callbacks.java&lt;br /&gt;
// Using inner classes for callbacks&lt;br /&gt;
// From &amp;quot;Thinking in Java, 3rd ed.&amp;quot; (c) Bruce Eckel 2002&lt;br /&gt;
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.&lt;br /&gt;
interface Incrementable {&lt;br /&gt;
  void increment();&lt;br /&gt;
}&lt;br /&gt;
// Very simple to just implement the interface:&lt;br /&gt;
class Callee1 implements Incrementable {&lt;br /&gt;
  private int i = 0;&lt;br /&gt;
  public void increment() {&lt;br /&gt;
    i++;&lt;br /&gt;
    System.out.println(i);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class MyIncrement {&lt;br /&gt;
  void increment() {&lt;br /&gt;
    System.out.println(&amp;quot;Other operation&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  static void f(MyIncrement mi) {&lt;br /&gt;
    mi.increment();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
// If your class must implement increment() in&lt;br /&gt;
// some other way, you must use an inner class:&lt;br /&gt;
class Callee2 extends MyIncrement {&lt;br /&gt;
  private int i = 0;&lt;br /&gt;
  private void incr() {&lt;br /&gt;
    i++;&lt;br /&gt;
    System.out.println(i);&lt;br /&gt;
  }&lt;br /&gt;
  private class Closure implements Incrementable {&lt;br /&gt;
    public void increment() {&lt;br /&gt;
      incr();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  Incrementable getCallbackReference() {&lt;br /&gt;
    return new Closure();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Caller {&lt;br /&gt;
  private Incrementable callbackReference;&lt;br /&gt;
  Caller(Incrementable cbh) {&lt;br /&gt;
    callbackReference = cbh;&lt;br /&gt;
  }&lt;br /&gt;
  void go() {&lt;br /&gt;
    callbackReference.increment();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class Callbacks {&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    Callee1 c1 = new Callee1();&lt;br /&gt;
    Callee2 c2 = new Callee2();&lt;br /&gt;
    MyIncrement.f(c2);&lt;br /&gt;
    Caller caller1 = new Caller(c1);&lt;br /&gt;
    Caller caller2 = new Caller(c2.getCallbackReference());&lt;br /&gt;
    caller1.go();&lt;br /&gt;
    caller1.go();&lt;br /&gt;
    caller2.go();&lt;br /&gt;
    caller2.go();&lt;br /&gt;
  }&lt;br /&gt;
} ///:~&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== With concrete or abstract classes, inner classes are the only way to produce the effect ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// : c08:MultiImplementation.java&lt;br /&gt;
// With concrete or abstract classes, inner classes are the only way to produce the effect&lt;br /&gt;
// of &amp;quot;multiple implementation inheritance.&amp;quot;&lt;br /&gt;
// From &amp;quot;Thinking in Java, 3rd ed.&amp;quot; (c) Bruce Eckel 2002&lt;br /&gt;
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.&lt;br /&gt;
class D {&lt;br /&gt;
}&lt;br /&gt;
abstract class E {&lt;br /&gt;
}&lt;br /&gt;
class Z extends D {&lt;br /&gt;
  E makeE() {&lt;br /&gt;
    return new E() {&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class MultiImplementation {&lt;br /&gt;
  static void takesD(D d) {&lt;br /&gt;
  }&lt;br /&gt;
  static void takesE(E e) {&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    Z z = new Z();&lt;br /&gt;
    takesD(z);&lt;br /&gt;
    takesE(z.makeE());&lt;br /&gt;
  }&lt;br /&gt;
} ///:~&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>