notes- nested classes in java

Upload: rohan-bose

Post on 07-Jul-2018

224 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/18/2019 Notes- Nested Classes in Java

    1/21

    Nested Classes in Java

    Slides by Alon Mishne1

  • 8/18/2019 Notes- Nested Classes in Java

    2/21

    In This Tutorial

    • Explanation of the nested class concept.

    • Access modifiers and nested classes.

    •The types of nested classes in Java.

    • Inheritance and inner classes.

    • Nested classes in the JVM.

    • Limits and caveats

    2

  • 8/18/2019 Notes- Nested Classes in Java

    3/21

    The Concept

    • Like C++, Java supports defining classes inside

    other classes. The general term for these

    classes is nested classes.

    • Classes which are not defined inside other

    classes are called top-level classes.

    • In Java, there are 4 types of nested classes.

    • Nested classes are used extensively in Java.

    3

  • 8/18/2019 Notes- Nested Classes in Java

    4/21

  • 8/18/2019 Notes- Nested Classes in Java

    5/21

    Type 1 – Static Nested Classes

    • Defined as member classes, with the staticmodifier.

    • Most similar to nested classes in C++.

    •Helps in encapsulation – for example, if B isuseful only to A.

    class A {...static class B {

    ...}...

    }

    • A static nested class canhave any visibility, just like

    any other member.• Cannot access non-static

    members of enclosingclass.

    5

  • 8/18/2019 Notes- Nested Classes in Java

    6/21

    Inner Classes

    • Nested classes which are not static are calledinner classes.

    • There are 3 kinds of inner classes: – non-static member class, a.k.a. (regular) inner class

     – local class

     – anonymous class

    • An instance of an inner classes is associated withan instance of the enclosing class.

    • Consequentially, inner classes can access non-static members of the enclosing class.

    6

  • 8/18/2019 Notes- Nested Classes in Java

    7/21

    More on Inner Classes

    • Instances of enclosing / nested classes do not

    contain each other – they are only associated

    with each other.

    • An instance of an enclosing class may be

    associated with multiple instances of inner

    classes.

    • An instance of an inner class is associated with

    exactly one instance of the enclosing class.

    7

  • 8/18/2019 Notes- Nested Classes in Java

    8/21

    Type 2 – Non-Static Member

    Classes

    • Defined as member classes, without the static

    modifier.

    • An instance of B is always associated with an

    instance of A.

    class A {

    ...class B {

    ...}...

    }

    • A.B can have any visibility.

    • Created with qualified new

    A a = new A();A.B ab = a.new B();

    // „ab‟ is associated with „a‟

    8

  • 8/18/2019 Notes- Nested Classes in Java

    9/21

    • If B is an inner class of A, it may access theassociated A instance’s this pointer via the

    qualified A.this

    • This access if only available for non staticnested classes (why?).

    Access to enclosing class

    class A {

    void foo() { System.out.println(“A”); }class B {void foo() { System.out.println(“B”); }void bar() { A.this.foo(); } //prints A

    }}

    9

  • 8/18/2019 Notes- Nested Classes in Java

    10/21

    Type 3 – Local Classes•

    Defined inside a method, and only visible fromthe point it is declared to the end of themethod.

    • If defined inside a non-static method, is

    considered an inner class and has access tonon-static members – otherwise, behavesmore like static nested class.

    • Can access parameters as well as localvariables declared in the same method beforethe class is declared, but only as long as theyare marked final (why?).

    10

  • 8/18/2019 Notes- Nested Classes in Java

    11/21

    Local Classes - Exampleclass Outer {

    private int x;void f() {

    final int y = 4;class Inner {

    void inc() {x += y; // Legal – y is final

    }}Inner i = new Inner();

    }static void g() {

    Inner i = new Inner(); // Illegal – classdeclaration must appear first

    class Inner { // Legal to use the same namevoid inc() {

    x++; // Illegal – cannot access non-static field x

    }}

    }}11

  • 8/18/2019 Notes- Nested Classes in Java

    12/21

  • 8/18/2019 Notes- Nested Classes in Java

    13/21

    Anonymous Classes - Syntax

    • Simple example:

    new () {}

    interface A {void g();

    }

    class B {

    void f() {A a = new A() {

    void g() {}};a.g();

    }

    }13

  • 8/18/2019 Notes- Nested Classes in Java

    14/21

    Anonymous Classes & Constructors

    • Anonymous classes cannot have constructors* (they don’teven have a name).

    • Constructors of a parent class can be invoked using theargument list.

    class A {public A(int x) {...}void g() {...}

    }

    class B {void f() {(new A(3) {void g() {...}}).g();

    }}

    * They can have instance initializers, though. Outside of our scope.14

  • 8/18/2019 Notes- Nested Classes in Java

    15/21

    Nested Class Types Summary

    Type Inner

    (associated with

    outer instance)

    Definition point Visibility

    Static nested class No As a member of

    another class.

    Depends on access

    modifier.

    Non-static member

    class

    (regular inner class)

    Yes As a member of

    another class.

    Depends on access

    modifier.

    Local class Yes (if defined in

    non-static method)

    Inside a method. From the point it is

    defined to the end

    of the method.Anonymous class Yes (if defined in

    non-static method)

    As an expression

    (since defining it

    also returns the

    instance).

    None.

    15

  • 8/18/2019 Notes- Nested Classes in Java

    16/21

    Inheriting from inner classes 1/2

    • It’s possible to inherit from an inner class, butonly as long as the inheriting class can beassociated with a subtype of the original outerclass. Example of the legal scenarios:

    16

    class BaseOuter {class BaseInner {}// Legal because BaseOuter is a subtype of BaseOuter:class BaseInner2 extends BaseInner {}

    }

    class DerivedOut extends BaseOuter {// Legal because DerivedOuter is a subtype of BaseOuter:class DerivedInner extends BaseInner {}

    }

  • 8/18/2019 Notes- Nested Classes in Java

    17/21

    Inheriting from inner classes 2/2

    • What would happen without this limitation?

    17

    class Outer {

    int x;class Inner {void f() { x++; }

    }}

    class Derived extends Outer.Inner {}

    void someMethod() {new Derived().f(); // What will happen?

    }

  • 8/18/2019 Notes- Nested Classes in Java

    18/21

    Nested Classes and the JVM

    • There is no concept of nested classes in

    bytecode or in the JVM. The compiler

    generates a separate .class file for each class.

    public class Outer {class Inner {}

    }

    > javac Outer.java> lsOuter.javaOuter.classOuter$Inner.class

    • Since access modifiers

    are enforced in the JVM,

    the compiler sometimeshas to work hard to split

    nested classes into

    independent classes.18

  • 8/18/2019 Notes- Nested Classes in Java

    19/21

    Inner Classes and the JVM

    Likewise, any outer local variables used arepassed in the constructor, which is why only finallocals are permitted (what would happen

    otherwise?)

    public class Outer {class Inner {}

    }

    public class Outer {static class Inner {

    Outer $this;Inner(Outer $this) {

    this.$this = $this;}

    }}

    actually compiles tosomething like:

    19

  • 8/18/2019 Notes- Nested Classes in Java

    20/21

    Some Limitations of Nested Classes

    • Nested interfaces are always implicitly static.

    • Inner classes may not declare static members

    (with the exception of compile-time constant

    fields).

    20

  • 8/18/2019 Notes- Nested Classes in Java

    21/21

    More Information

    • Sun’s official tutorial at

    http://java.sun.com/docs/books/tutorial/java/

     javaOO/nested.html

    • For the brave – the Java Language

    Specification at

    http://java.sun.com/docs/books/jls/third_edit

    ion/html/j3TOC.html

    21

    http://java.sun.com/docs/books/tutorial/java/javaOO/nested.htmlhttp://java.sun.com/docs/books/tutorial/java/javaOO/nested.htmlhttp://java.sun.com/docs/books/jls/third_edition/html/j3TOC.htmlhttp://java.sun.com/docs/books/jls/third_edition/html/j3TOC.htmlhttp://java.sun.com/docs/books/jls/third_edition/html/j3TOC.htmlhttp://java.sun.com/docs/books/jls/third_edition/html/j3TOC.htmlhttp://java.sun.com/docs/books/jls/third_edition/html/j3TOC.htmlhttp://java.sun.com/docs/books/jls/third_edition/html/j3TOC.htmlhttp://java.sun.com/docs/books/tutorial/java/javaOO/nested.htmlhttp://java.sun.com/docs/books/tutorial/java/javaOO/nested.html