Java Inner Classes


Java Inner Classes

In Java, it is also possible to host classes (classroom within the classroom). The purpose of nesting classes is to integrate classes, making your code more readable and secure.

To access the inner class, create an outer class object, and then create an inner class object:


Example
class OuterClass {
            int x = 10;
          
            class InnerClass {
              int y = 5;
            }
          }
          
          public class Main {
            public static void main(String[] args) {
              OuterClass myOuter = new OuterClass();
              OuterClass.InnerClass myInner = myOuter.new InnerClass();
              System.out.println(myInner.y + myOuter.x);
            }
          }
          
          // Outputs 15 (5 + 10)
          


Private Inner Class

Unlike the "normal" category, the internal category can be private or protected. If you do not want external content to reach the internal category, declare class as private:


Example
class OuterClass {
            int x = 10;
          
            private class InnerClass {
              int y = 5;
            }
          }
          
          public class Main {
            public static void main(String[] args) {
              OuterClass myOuter = new OuterClass();
              OuterClass.InnerClass myInner = myOuter.new InnerClass();
              System.out.println(myInner.y + myOuter.x);
            }
          }
          

If you try to access a private inner class from an outside class, an error occurs:


Main.java:13: error: OuterClass.InnerClass has private access in OuterClass
    OuterClass.InnerClass myInner = myOuter.new InnerClass();
              ^


Static Inner Class

Internal category can also be static, meaning you can access it without creating an external category:


Example
class OuterClass {
            int x = 10;
          
            static class InnerClass {
              int y = 5;
            }
          }
          
          public class Main {
            public static void main(String[] args) {
              OuterClass.InnerClass myInner = new OuterClass.InnerClass();
              System.out.println(myInner.y);
            }
          }
          
          // Outputs 5
          

Note: just like static attributes and methods, the static internal class cannot be accessed by external class members.


Access Outer Class From Inner Class

Another advantage of internal classes, is that they can access the qualities and methods of the external class:


Example
class OuterClass {
            int x = 10;
          
            class InnerClass {
              public int myInnerMethod() {
                return x;
              }
            }
          }
          
          public class Main {
            public static void main(String[] args) {
              OuterClass myOuter = new OuterClass();
              OuterClass.InnerClass myInner = myOuter.new InnerClass();
              System.out.println(myInner.myInnerMethod());
            }
          }
          
          // Outputs 10