<?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_Tutorial%2FClass_Definition%2FNested_Classes</id>
		<title>Java Tutorial/Class Definition/Nested Classes - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java_Tutorial%2FClass_Definition%2FNested_Classes"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java_Tutorial/Class_Definition/Nested_Classes&amp;action=history"/>
		<updated>2026-04-21T22:30:34Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java_Tutorial/Class_Definition/Nested_Classes&amp;diff=4192&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java_Tutorial/Class_Definition/Nested_Classes&amp;diff=4192&amp;oldid=prev"/>
				<updated>2010-06-01T05:00:37Z</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;Версия 05:00, 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_Tutorial/Class_Definition/Nested_Classes&amp;diff=4191&amp;oldid=prev</id>
		<title> в 17:44, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java_Tutorial/Class_Definition/Nested_Classes&amp;diff=4191&amp;oldid=prev"/>
				<updated>2010-05-31T17:44:27Z</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;==  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;
class A {&lt;br /&gt;
  private InnerA y;&lt;br /&gt;
  protected class InnerA {&lt;br /&gt;
    public InnerA() { System.out.println(&amp;quot;A.InnerA()&amp;quot;); }&lt;br /&gt;
  }&lt;br /&gt;
  public A() {&lt;br /&gt;
    System.out.println(&amp;quot;New A()&amp;quot;);&lt;br /&gt;
    y = new InnerA();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class B extends A {&lt;br /&gt;
  public class InnerB {&lt;br /&gt;
    public InnerB() { System.out.println(&amp;quot;B.InnerB()&amp;quot;); }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class MainClass{&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    new B();&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 new nested object outside ==&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;
class Outside {&lt;br /&gt;
  public class Inside {&lt;br /&gt;
  }&lt;br /&gt;
  public Outside() {&lt;br /&gt;
    Inside inner = new Inside();&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;
&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;
public class MainClass {&lt;br /&gt;
  class A {&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 B {&lt;br /&gt;
    private String label;&lt;br /&gt;
    B(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 MainClass:&lt;br /&gt;
  public void ship(String dest) {&lt;br /&gt;
    A c = new A();&lt;br /&gt;
    B d = new B(dest);&lt;br /&gt;
    System.out.println(d.readLabel());&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    MainClass p = new MainClass();&lt;br /&gt;
    p.ship(&amp;quot;AAA&amp;quot;);&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;
public class MainClass {&lt;br /&gt;
  class A {&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 B {&lt;br /&gt;
    private String label;&lt;br /&gt;
    B(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;
    MainClass p = new MainClass();&lt;br /&gt;
    // Must use instance of outer class&lt;br /&gt;
    // to create an instances of the inner class:&lt;br /&gt;
    MainClass.A c = p.new A();&lt;br /&gt;
    MainClass.B d = p.new B(&amp;quot;A&amp;quot;);&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;
==  Defining references to 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;
public class MainClass {&lt;br /&gt;
  class A {&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 B {&lt;br /&gt;
    private String label;&lt;br /&gt;
    B(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 B to(String s) {&lt;br /&gt;
    return new B(s);&lt;br /&gt;
  }&lt;br /&gt;
  public A cont() {&lt;br /&gt;
    return new A();&lt;br /&gt;
  }&lt;br /&gt;
  public void ship(String dest) {&lt;br /&gt;
    A c = cont();&lt;br /&gt;
    B 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;
    MainClass p = new MainClass();&lt;br /&gt;
    p.ship(&amp;quot;A&amp;quot;);&lt;br /&gt;
    MainClass q = new MainClass();&lt;br /&gt;
    MainClass.A c = q.cont();&lt;br /&gt;
    MainClass.B d = q.to(&amp;quot;A&amp;quot;);&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;
==  Local inner class can have a constructor ==&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;
interface Counter {&lt;br /&gt;
  int next();&lt;br /&gt;
}&lt;br /&gt;
public class MainClass{&lt;br /&gt;
  &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;
  &lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    MainClass lic = new MainClass();&lt;br /&gt;
    Counter c1 = lic.getCounter(&amp;quot;Local inner &amp;quot;);&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 ==&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;
class Outside {&lt;br /&gt;
  public class Inside {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class MainClass {&lt;br /&gt;
  public static void main(String[] arg) {&lt;br /&gt;
    Outside outer = new Outside();&lt;br /&gt;
    Outside.Inside inner = outer.new Inside();&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;
&amp;lt;pre class=codeResult&amp;gt;Nested Classes&amp;lt;/pre&amp;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;
class MyClass {&lt;br /&gt;
  private void f() {}&lt;br /&gt;
  class A {&lt;br /&gt;
    private void g() {}&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;
public class MainClass {&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    MyClass a = new MyClass();&lt;br /&gt;
    MyClass.A innerA = a.new A();&lt;br /&gt;
    MyClass.A.B innerb = innerA.new B();&lt;br /&gt;
    innerb.h();&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 (static 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;
public class MainClass {&lt;br /&gt;
  private static class ClassA implements A {&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;
  protected static class ClassB implements B {&lt;br /&gt;
    private String label;&lt;br /&gt;
    private ClassB(String whereTo) {&lt;br /&gt;
      label = whereTo;&lt;br /&gt;
    }&lt;br /&gt;
    public String readLabel() {&lt;br /&gt;
      return label;&lt;br /&gt;
    }&lt;br /&gt;
    // Nested classes can contain other static elements:&lt;br /&gt;
    public static void f() {&lt;br /&gt;
    }&lt;br /&gt;
    static int x = 10;&lt;br /&gt;
    static class InnerInnerClass {&lt;br /&gt;
      public static void f() {&lt;br /&gt;
      }&lt;br /&gt;
      static int x = 10;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public static B dest(String s) {&lt;br /&gt;
    return new ClassB(s);&lt;br /&gt;
  }&lt;br /&gt;
  public static A cont() {&lt;br /&gt;
    return new ClassA();&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    A c = cont();&lt;br /&gt;
    B d = dest(&amp;quot;A&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface A {&lt;br /&gt;
  int value();&lt;br /&gt;
}&lt;br /&gt;
interface B {&lt;br /&gt;
  String readLabel();&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 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;
public class MainClass {&lt;br /&gt;
  public A dest(String s) {&lt;br /&gt;
    class B implements A {&lt;br /&gt;
      private String label;&lt;br /&gt;
      private B(String whereTo) {&lt;br /&gt;
        label = whereTo;&lt;br /&gt;
      }&lt;br /&gt;
      public String readLabel() {&lt;br /&gt;
        return label;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return new B(s);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    MainClass p = new MainClass();&lt;br /&gt;
    A d = p.dest(&amp;quot;A&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface A {&lt;br /&gt;
  String readLabel();&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;
public class MainClass {&lt;br /&gt;
  private void method(boolean b) {&lt;br /&gt;
    if (b) {&lt;br /&gt;
      class A {&lt;br /&gt;
        private String id;&lt;br /&gt;
        A(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;
      A ts = new A(&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;
    // ! A ts = new A(&amp;quot;x&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public void track() {&lt;br /&gt;
    method(true);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    MainClass p = new MainClass();&lt;br /&gt;
    p.track();&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;
class A {&lt;br /&gt;
  protected class InnerA {&lt;br /&gt;
    public InnerA() {&lt;br /&gt;
      System.out.println(&amp;quot;A.InnerA()&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void f() {&lt;br /&gt;
      System.out.println(&amp;quot;A.InnerA.f()&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private InnerA y = new InnerA();&lt;br /&gt;
  public A() {&lt;br /&gt;
    System.out.println(&amp;quot;New A()&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public void insertYolk(InnerA 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;
class B extends A {&lt;br /&gt;
  public class InnerB extends A.InnerA {&lt;br /&gt;
    public InnerB() {&lt;br /&gt;
      System.out.println(&amp;quot;B.InnerB()&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void f() {&lt;br /&gt;
      System.out.println(&amp;quot;B.InnerB.f()&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public B() {&lt;br /&gt;
    insertYolk(new InnerB());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class MainClass {&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    A e2 = new B();&lt;br /&gt;
    e2.g();&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;
&amp;lt;pre class=codeResult&amp;gt;A.InnerA()&lt;br /&gt;
New A()&lt;br /&gt;
A.InnerA()&lt;br /&gt;
B.InnerB()&lt;br /&gt;
B.InnerB.f()&amp;lt;/pre&amp;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;
public class MainClass {&lt;br /&gt;
  public MainClass() {&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;
      MainClass t = new MainClass();&lt;br /&gt;
      t.f();&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;
class MyClass {&lt;br /&gt;
  private class ClassB implements B {&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;
  protected class ClassA implements A {&lt;br /&gt;
    private String label;&lt;br /&gt;
    private ClassA(String whereTo) {&lt;br /&gt;
      label = whereTo;&lt;br /&gt;
    }&lt;br /&gt;
    public String readLabel() {&lt;br /&gt;
      return label;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public A dest(String s) {&lt;br /&gt;
    return new ClassA(s);&lt;br /&gt;
  }&lt;br /&gt;
  public B cont() {&lt;br /&gt;
    return new ClassB();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class MainClass {&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    MyClass p = new MyClass();&lt;br /&gt;
    B c = p.cont();&lt;br /&gt;
    A d = p.dest(&amp;quot;A&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface B {&lt;br /&gt;
  int value();&lt;br /&gt;
}&lt;br /&gt;
interface A {&lt;br /&gt;
  String readLabel();&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;
==  Static Nested 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;
public class Outside {&lt;br /&gt;
  public static class Skinside {&lt;br /&gt;
  }&lt;br /&gt;
  public class Inside {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class MainClass {&lt;br /&gt;
  public static void main(String[] arg) {&lt;br /&gt;
    Outside.Skinside example = new Outside.Skinside();&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;
&lt;br /&gt;
==  Two ways that a class can implement multiple interfaces ==&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;
interface A {&lt;br /&gt;
}&lt;br /&gt;
interface B {&lt;br /&gt;
}&lt;br /&gt;
class X implements A, B {&lt;br /&gt;
}&lt;br /&gt;
class Y implements A {&lt;br /&gt;
  B makeB() {&lt;br /&gt;
    // Anonymous inner class:&lt;br /&gt;
    return new B() {&lt;br /&gt;
    };&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class MainClass {&lt;br /&gt;
  static void takesA(A a) {&lt;br /&gt;
  }&lt;br /&gt;
  static void takesB(B b) {&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    X x = new X();&lt;br /&gt;
    Y y = new Y();&lt;br /&gt;
    takesA(x);&lt;br /&gt;
    takesA(y);&lt;br /&gt;
    takesB(x);&lt;br /&gt;
    takesB(y.makeB());&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;
interface InterfaceA {&lt;br /&gt;
  void increment();&lt;br /&gt;
}&lt;br /&gt;
class ClassA implements InterfaceA {&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 ClassB {&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(ClassB mi) {&lt;br /&gt;
    mi.increment();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class ClassC extends ClassB {&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 InterfaceA {&lt;br /&gt;
    public void increment() {&lt;br /&gt;
      incr();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  InterfaceA getCallbackReference() {&lt;br /&gt;
    return new Closure();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Caller {&lt;br /&gt;
  private InterfaceA callbackReference;&lt;br /&gt;
  Caller(InterfaceA 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 MainClass {&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    ClassA c1 = new ClassA();&lt;br /&gt;
    ClassC c2 = new ClassC();&lt;br /&gt;
    ClassB.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;
}&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 of multiple implementation inheritance. ==&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;
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 MainClass {&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;
}&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>