Java Tutorial-Java Inner Classes

Java Inner Classes


In Java, we can nest a class within a class. The purpose of nested classes is to group classes that belong together, which make your code more readable and maintainable.

To access the inner class, we first create a object for outer class and then create a object for inner class with the outside object class.

 

Example


In the below example we create OuterClass.java and a main class Java file as shown below:


OuterClass.java

public class OuterClass {
       String outerString = "Welcome to";
       class InnerClass {
              String innerString = "SparkDatabox";
       }
}

JavaInnerClassesExample.java

public class JavaInnerClassesExample {
       public static void main (String args[]){
              OuterClass myOuter = new OuterClass();
              OuterClass.InnerClass myInner = myOuter.new InnerClass();
              System.out.println(myOuter.outerString +" "+myInner.innerString);
       }
}

Output

Welcome to SparkDatabox

Example Explained


  • The class InnerClass has been created inside the OuterClass class.
  • The object myOuter is created for the OuterClass class and the object for Inner class is created with the dot of the outer class and the inner class.


Private Inner Class


Unlike “regular” classes, an inner class can be “private” or “protected”. If we don’t want the outside objects to access the inner class, declare the class as “private”:

 

Example


In the below example, the inner class is “private” and if we try to access the inner class, then we get the error message as shown below:


OuterClass.java

public class OuterClass {
       String outerString = "Welcome to";
       private class InnerClass {
              String innerString = "SparkDatabox";
       }
}

JavaInnerClassesExample.java

public class JavaInnerClassesExample {
       public static void main (String args[]){
              OuterClass myOuter = new OuterClass();
              OuterClass.InnerClass myInner = myOuter.new InnerClass();
              System.out.println(myOuter.outerString +" "+myInner.innerString);
       }
}

Error message

The type OuterClass.InnerClass is not visible
       The type OuterClass.InnerClass is not visible
 
       at practices.JavaInnerClasses.main(JavaInnerClasses.java:6)

Static Inner class


An inner class can also be static so that it can be accessed without creating an object of the outer class.


Example


OuterClass.java

public class OuterClass {
       String outerString = "Welcome to";
       static class InnerClass {
              String innerString = "SparkDatabox";
       }
}

JavaInnerClassesExample.java

public class JavaInnerClassesExample {
       public static void main (String args[]){
              OuterClass.InnerClass myInner = new OuterClass.InnerClass();
              System.out.println(myInner.innerString);
       }
}

Output

SparkDatabox

Access Outer Class from Inner Class


The outer class attributes and methods can be accessed from inner class.


Example


In the below example, we access the outer class attribute from the inner class method.


OuterClass.java

public class OuterClass {
       String outerString = "SparkDatabox";
       class InnerClass {
              public String innerMethod(){
                     return outerString;
              }
       }
}

JavaInnerClassesExample.java

public class JavaInnerClassesExample {
       public static void main (String args[]){
              OuterClass myOuter = new OuterClass();
              OuterClass.InnerClass myInner = myOuter.new InnerClass();
              System.out.println(myInner.innerMethod());
       }
}

Output

SparkDatabox