Java platform provides you to define a class within another class. Such a class is known as nested class. The class that holds the nested class is known as Outer class. It is merely a convenient way of grouping two or more classes together into a single unit or module. A class that contains a nested class is known as the enclosing or outer class of the nested class. In java, We can’t use the static keyword with a class unless it is an Inner class(or non-static nested class), but we can make a nested class static in Java.
Nested classes are used for a variety of purposes such as
• GUI event handling.
• Hiding a class from other classes in the same package.
• As helper classes to perform some specific function ( such as implementing a particular action) or to provide a particular view onto some data (by providing an iterator or enumerator.)
• An object of the inner class can access the implementation of the object that created it, including data that would otherwise be private.
• Allows implementing the same interface more than once in a class.
• Make the code more readable and maintainable as it placed closer to where it used.
Nested classes are divided into two categories: Static nested classes and non-static nested classes. Non-static nested classes are also called inner classes. The Inner classes can further classify into three types: Regular inner classes, Locale inner classes, and Anonymous inner classes.
A static nested class or a top-level class is a class that is declared inside another class with a static modifier. Like static methods, a static nested class can only refer directly to static members of the enclosing classes, even if those members are private. That is, it cannot refer to members of its enclosing class directly.
The following example demonstrates the use of static nested class.
public class OuterClassName {
public static class InnerClassName {
// body of static nested class
}
// More members of outside class
}
Nested classes generally made static when they have a strong relationship with the enclosing class, but their existence is independent of an instance of the enclosing class. Unlike inner classes, you can instantiate the static nested class even if you have not instantiated the outer class. For example:
OuterClassName.InnerClassName = new OuterClassName.InnerClassName();
The following program demonstrates the use of static nested class.
class outer
{
private double i = 11.7 ;
private static String str = "Hi Programmers";
static class inner
{
int j ;
public void display()
{
j = 51;
System.out.println("j = " + j);
//System.out.prinln("i = " + i); illegal statement
System.out.println("str = " + str);
}
}
}
class StaticClass
{
public static void main(String[] args)
{
outer.inner innobj =new outer.inner();
//create instance of //static nested class
innobj.display();
}
}
Explanation: As static keyword is used in the innerclass so it is a static class. The str variable is declared static so it can be accessed in the static class. The variable i is not declared static so it cannot be accessed in the class.
What are the differences between static and non-static nested classes?
Following are the differences between static nested class and non-static nested class. A non-static nested class is also called Inner Class.
• These are non-static members classes. Whereas non-static inner classes defined as instance members of other classes just like an instance variable and method members defined in a class. An instance of non-static inner class always has an instance of the enclosing class associated with it.
• A static nested class doesn’t have a reference of Outer class, but Inner class(or non-static nested class) requires a reference of Outer class. You can not create an instance of Non-static nested class without creating an instance of Outer class.
• The non-static nested class can access all members static and non-static members of Outer class. A static class cannot access all members of the Outer class. It can access only static members of Outer class.