Внутренний класс в java
Внутренний класс означает один класс, который является членом другого класса. В java существует четыре основных типа внутренних классов.
1) Вложенный внутренний класс
2) Метод Локальные внутренние классы
3) Анонимные внутренние классы
4) Статические вложенные классы
Вложенный внутренний класс может получить доступ к любой частной переменной экземпляра внешнего класса. Как и любая другая переменная экземпляра, у нас может быть модификатор доступа private, protected, public и модификатор по умолчанию.
Как и класс, интерфейс может быть вложенным и иметь спецификаторы доступа.
Following example demonstrates a nested class.
class Outer { // Simple nested inner class class Inner { public void show() { System.out.println( "In a nested class method" ); } } } class Main { public static void main(String[] args) { Outer.Inner in = new Outer(). new Inner(); in.show(); } } |
Выход:
In a nested class method
As a side note, we can’t have static method in a nested inner class because an inner class is implicitly associated with an object of its outer class so it cannot define any static method for itself. For example the following program doesn’t compile.
class Outer { void outerMethod() { System.out.println( "inside outerMethod" ); } class Inner { public static void main(String[] args){ System.out.println( "inside inner class Method" ); } } } |
Выход:
Ошибка недопустимого статического объявления во внутреннем классе Outer.Inner public static void main (String [] args) модификатор static разрешен только в константе объявление переменной
Интерфейс также может быть вложенным, и вложенные интерфейсы обладают некоторыми интересными свойствами. В следующем посте мы рассмотрим вложенные интерфейсы.
Method Local inner classes
Inner class can be declared within a method of an outer class. In the following example, Inner is an inner class in outerMethod().
class Outer { void outerMethod() { System.out.println( "inside outerMethod" ); // Inner class is local to outerMethod() class Inner { void innerMethod() { System.out.println( "inside innerMethod" ); } } Inner y = new Inner(); y.innerMethod(); } } class MethodDemo { public static void main(String[] args) { Outer x = new Outer(); x.outerMethod(); } } |
Выход
Внутри outerMethod Внутри innerMethod
Method Local inner classes can’t use local variable of outer method until that local variable is not declared as final. For example, the following code generates compiler error (Note that x is not final in outerMethod() and innerMethod() tries to access it)
class Outer { void outerMethod() { int x = 98 ; System.out.println( "inside outerMethod" ); class Inner { void innerMethod() { System.out.println( "x= " +x); } } Inner y = new Inner(); y.innerMethod(); } } class MethodLocalVariableDemo { public static void main(String[] args) { Outer x= new Outer(); x.outerMethod(); } } |
Выход:
доступ к локальной переменной x осуществляется из внутреннего класса; должен быть объявлен окончательным
Примечание. Локальный внутренний класс не может получить доступ к не конечной локальной переменной до JDK 1.7. Начиная с JDK 1.8, можно получить доступ к не конечной локальной переменной в локальном внутреннем классе метода.
But the following code compiles and runs fine (Note that x is final this time)
class Outer { void outerMethod() { final int x= 98 ; System.out.println( "inside outerMethod" ); class Inner { void innerMethod() { System.out.println( "x = " +x); } } Inner y = new Inner(); y.innerMethod(); } } class MethodLocalVariableDemo { public static void main(String[] args){ Outer x = new Outer(); x.outerMethod(); } } |
Выход-:
Внутри outerMethod Х = 98
Основная причина, по которой нам нужно объявить локальную переменную как конечную, заключается в том, что локальная переменная живет в стеке до тех пор, пока метод не будет в стеке, но может быть случай, когда объект внутреннего класса все еще живет в куче.
Локальный внутренний класс метода не может быть помечен как частный, защищенный, статический и временный, но может быть помечен как абстрактный и окончательный, но не оба одновременно.
Static nested classes
Static nested classes are not technically an inner class. They are like a static member of outer class.
class Outer { private static void outerMethod() { System.out.println( "inside outerMethod" ); } // A static inner class static class Inner { public static void main(String[] args) { System.out.println( "inside inner class Method" ); outerMethod(); } } } |
Выход
внутри внутреннего класса Method внутри externalMethod
Anonymous inner classes
Anonymous inner classes are declared without any name at all. They are created in two ways.
a) As subclass of specified type
class Demo { void show() { System.out.println( "i am in show method of super class" ); } } class Flavor1Demo { // An anonymous class with Demo as base class static Demo d = new Demo() { void show() { super .show(); System.out.println( "i am in Flavor1Demo class" ); } }; public static void main(String[] args){ d.show(); } } |
Выход
Я в шоу-методе суперкласса я в классе Flavor1Demo
В приведенном выше коде у нас есть два класса Demo и Flavor1Demo. Здесь демонстрация действует как суперкласс, а анонимный класс действует как подкласс, оба класса имеют метод show (). В анонимном классе метод show () переопределяется.
a) As implementer of the specified interface
class Flavor2Demo { // An anonymous class that implements Hello interface static Hello h = new Hello() { public void show() { System.out.println( "i am in anonymous class" ); } }; public static void main(String[] args) { h.show(); } } interface Hello { void show(); } |
Выход:
я в анонимном классе
В приведенном выше коде мы создаем объект анонимного внутреннего класса, но этот анонимный внутренний класс является средством реализации интерфейса Hello. Любой анонимный внутренний класс может одновременно реализовывать только один интерфейс. Он может либо расширять класс, либо реализовывать интерфейс за раз.
Эта статья предоставлена Паваном Кумаром . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше
Вниманию читателя! Не переставай учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по доступной для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .