Классы, которые объявлены вне любого класса являются классами верхнего уровня. Вложенные классы-это классы объявленные в качестве членов других классов или областей.
Есть четыре вида вложенных классов:
- статические классы члены,
- нестатические классы членов,
- анонимные классы
- локальные классы.
Анонимный класс java
Анонимный класс является классом без имени и если его одновременно объявили. Вы можете создать экземпляр анонимного класса, чтобы указать выражение.
Экземпляр анонимного класса может получить доступ только к локальным переменным и к конечным окончательным параметрам.
Как определить анонимный класс?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//nookery.ru abstract class Fish { abstract void eat(); } public class Test { public static void main(final String[] args) { new Fish() { String msg = "Рыба "; @Override void eat() { System.out.println(msg); } }.eat(); } } |
Результатом работы программы будет: Рыба ест.
Следующий код объявляет и инициализирует анонимный класс, который реализует интерфейс.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//nookery.ru interface Fish { abstract void eat(); } public class Test { public static void main(final String[] args) { new Fish() { String msg = (args.length == 1) ? args[0] : "Рыба ест"; @Override public void eat() { System.out.println(msg); } }.eat(); } } |
Результатом работы программы будет: Рыба ест.
Локальные классы java
Локальный класс является классом, который объявлен в любом месте, где объявлена локальная переменная . Локальный класс имеет тот же объем, как локальная переменная.
Локальный класс имеет имя и может быть использован повторно. Экземпляр локальный класс может получить доступ к конечным локальным переменным, и конечным параметрам.
Java Локальный класс
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//nookery.ru class MyClass { void myMethod(final int x) { final int y = x; class LocalClass { int a = x; int b = y; } LocalClass lc = new LocalClass(); System.out.println(lc.a); System.out.println(lc.b); } } public class Test { public static void main(String[] args) { MyClass ec = new MyClass(); ec.myMethod(20); } } |
Результатом работы программы будет: 20 20
Java члены класса
Член класса-это член класса включения. Каждый экземпляр члена класса ассоциируется с экземпляром внешнего класса.
Методы экземпляра членов класса могут быть вызваны методом экземпляра в классе приложения и получить доступ к нестатическим полям экземпляра класса приложения.
Следующий код имеет один внешний класс с именем EnclosingClass и нестатические члены класса с именем EnclosedClass .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//nookery.ru class EnclosingClass { private int outerVariable; private void privateOuterMethod() { System.out.println(outerVariable); } class EnclosedClass { void accessEnclosingClass() { outerVariable = 1; privateOuterMethod(); } } } public class Test { public static void main(String[] args) { EnclosingClass ec = new EnclosingClass(); ec.new EnclosedClass().accessEnclosingClass(); } } |
Результатом работы программы будет: 1
Статический член класса Java.
Статический член класса- является статическим членом внешнего класса. Статический член класса не может получить доступ к классу включения полей экземпляра и вызывать его методы экземпляра.
Статический член может получить доступ к классу включения статическим полям и вызывать его статические методы, включая закрытые (private) поля и методы.
Следующий код имеет статический член класса.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//nookery.ru class Test { public static void main(String[] args) { // Test.EnclosedClass.accessEnclosingClass(); MyClass.EnclosedClass ec = new MyClass.EnclosedClass(); ec.accessEnclosingClass2(); } } class MyClass { private static int outerVariable; private static void privateStaticOuterMethod() { System.out.println(outerVariable); } static void staticOuterMethod() { EnclosedClass.accessEnclosingClass(); } static class EnclosedClass { static void accessEnclosingClass() { outerVariable = 1; privateStaticOuterMethod(); } void accessEnclosingClass2() { staticOuterMethod(); } } } |
Результатом работы программы будет: 1