SlideShare a Scribd company logo
Вложенные классы и
интерфейсы.
Виталий Унгурян
unguryan@itstep.org
Вложенный класс
Вложенный класс - это
класс, который объявлен
внутри тела другого
класса.
Вложенные классы
Вложенные классы делятся
на два вида:
 статические
 не статические.
Вложенные классы
Вложенные классы, объявленные
как статические называются
вложенными статическими (static
nested classes).
Не статические называются
внутренними (inner classes).
Вложенные классы (nested)
class OuterClass {
...
static class NestedClass {
...
}
}
Вложенные классы (inner)
class OuterClass {
...
class NestedClass {
...
}
}
Доступ к переменным
Статические — не имеют доступ к
членам обрамляющего класса.
Как и другие поля класса, вложенные
классы могут быть объявлены как
private, public, protected или package
private.
Доступ к переменным
Не статические классы
имеют доступ к полям
обрамляющего класса, даже
если они объявлены как
private.
Использование вложенных классов
Это хороший способ
группировки классов, которые
используются только в одном месте:
Если класс полезен (используется)
только внутри одного класса, то логично
будет держать их вместе. Вложение
таких вспомогательных классов делает
код более удобным.
Использование вложенных классов
Инкапсуляция:
Допустим, есть два класса A и B,
классу B требуется доступ к свойству
класса A, которое может быть
приватным. Вложение класса B в класс
A решит эту проблему, более того сам
класс B можно скрыть от внешнего
использования.
Использование вложенных классов
Улучшение читаемости и
обслуживаемости кода:
Вложение малых классов в более
высокоуровневые классы позволяет
хранить код там, где он используется.
Доступ к вложенным классам
Доступ к вложенному классу
осуществляется с помощью следующей
конструкции:
OuterClass.StaticNestedClass
Синтаксис создания объекта вложенного
класса:
OuterClass.StaticNestedClass
nestedObject = new
OuterClass.StaticNestedClass();
Внутренние классы
Внутренние (не статические) классы,
как переменные и методы связаны
с объектом внешнего класса.
Внутренние классы так же имеют
прямой доступ к полям внешнего
класса.
Ограничения внутрених классов
Внутренние классы не могут
содержать в себе статические методы
и поля.
Внутри внутренних классов нельзя
объявлять перечисления.
Внутренние классы
Внутренние классы не могут
существовать без экземпляра
внешнего.
Создание объекта внутреннего класса
Outer outerObject = new Outer();
Outer.Inner innerObject = outerObject.new
Inner();
Пример внутренних классов
public class OuterClass {
public void method() { ... }
public class InnerClass {
public void method() { ... }
public void anotherMethod() {
method();
}
}
}
Затенение (shadowing)
Если вы объявляете переменную (будь
то параметр или свойство класса) в
какой-либо области (например,
вложенный класс или область метода) с
именем уже занятым в данной области,
то такое объявление «затеняет»
предыдущее и вы не сможете
обращаться напрямую к переменной по
её имени.
Пример затенения
public class ShadowTest {
public int x = 0;
class FirstLevel {
public int x = 1;
void methodInFirstLevel(int x) {
System.out.println("x = " + x);
System.out.println("this.x = " + this.x);
System.out.println("ShadowTest.this.x = " +
ShadowTest.this.x);
}
}
Пример затенения
public static void main(String... args) {
ShadowTest st = new ShadowTest();
ShadowTest.FirstLevel fl = st.new FirstLevel();
fl.methodInFirstLevel(23);
}
}
Локальные классы
Локальные классы похожи на
внутренние: они не могут содержать
статические поля или методы.
Ограничения локальных классов
У локальных классов есть множество
ограничений:
Они видны только в пределах блока,
в котором объявлены;
Вы не сможете объявить интерфейс
внутри метода — интерфейсы
статичны.
Ограничения локальных классов
Локальный класс может содержать
статические поля, только если они
константы.
Они не могут быть объявлены как
private, public, protected или static;
Локальные классы
На практике чаще всего
объявление происходит в методе
некоторого другого класса.
Хотя объявлять локальный класс
можно внутри статических и
нестатических блоков инициализации.
Анонимные классы
Анонимные классы, в отличие от
локальных, не имеют имени. В отличие
от объявления обычных классов,
объявление анонимных классов
происходит внутри выражения.
Используйте анонимные классы, если
локальный класс нужен вам единожды.
Анонимные классы часто используются в
приложениях с графическим интерфейсом (GUI).
Пример анонимного класса
new Thread(new Runnable()
{
public void run() {
...
}
}).start();
Синтаксис анонимного класса
Определение анонимного класса содержит:
Оператор new
Имя интерфейса для реализации или класса
для наследования.
Скобки, также как и при создании обычных
объектов. Можно реализовать интерфейс или
абстрактный класс.
Доступ к локальным переменным
Анонимный класс имеет доступ к полям
внешнего класса.
Анонимный класс не имеет доступ
локальным переменным области, в которой
он определен, если они не финальные
(final) или неизменяемые (effectively final).
Как и у других внутренних классов,
объявление переменной с именем, которое
уже занято, затеняет предыдущее
объявление.
Ограничения анонимных классов
Нельзя определять статические
члены анонимного класса.
Анонимный класс может содержать
статические поля, если это константы.
Анонимные классы также могут
содержать в себе локальные классы.
Конструктора в анонимном классе
быть не может.
Использование final для классов
Класс с final не может подразделяться на
подклассы. От такого класса нельзя
наследоваться.
Если класс объявлен final и abstract
(взаимоисключающие понятия), произойдет
ошибка компиляции
Использование final для методов
Метод с final не может быть
переопределен в наследнике.
Аргументы методов, обозначенные как
final, предназначены только для чтения,
при попытке изменения будет ошибка
компиляции.
Использование final для переменных
Переменные final не инициализируются
по умолчанию, им необходимо явно
присвоить значение при объявлении
или в конструкторе, иначе – ошибка
компиляции.
Если final переменная содержит ссылку
на объект, объект может быть изменен,
но переменная всегда будет ссылаться
на тот же самый объект
Вложенные интерфейсы
Интерфейс может быть объявлен
членом класса или другого интерфейса.
Такой интерфейс называется
интерфейсом-членом или вложенным
интерфейсом.
Вложенный интерфейс может быть
объявлен как public, private или
protected.
Пример вложенного интерфейса
class A {
interface B {
void f();
}
public class C implements B {
public void f() {}
}
private class D implements B {
public void f() {}
}
}
Вложенные в интерфейсы классы.
Вложенный (nested) в интерфейс класс
является открытым (public) и
статическим (static) даже без явного
указания этих модификаторов.
Помещая класс внутрь интерфейса, мы
показываем, что он является
неотъемлемой частью API этого
интерфейса и более нигде не
используется.
interface Colorable {
public Color getColor();
public static class Color {
private int red, green, blue;
Color(int red, int green, int blue) {
this.red = red;
this.green = green;
this.blue = blue;
}
int getRed() { return red; }
int getGreen() { return green; }
int getBlue() { return blue; }
}
}
class Triangle implements Colorable {
private Color color; // ...
@Override
public Color getColor() {
return color; }
}
Использование
Colorable.Color color = new Colorable.Color(0, 0, 0);
color = new Triangle.Color(255, 255, 255);
Java. Вложенные классы и интерфейсы.

More Related Content

What's hot

принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#
bolevik
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
metaform
 
Исключения и ошибки
Исключения и ошибкиИсключения и ошибки
Исключения и ошибки
Unguryan Vitaliy
 
Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.
Unguryan Vitaliy
 
java 8
java 8java 8
Step 3.2
Step 3.2Step 3.2
Step 3.2
DmitryTrushkin
 
Шаблоны разработки ПО. Рефакторинг
Шаблоны разработки ПО. РефакторингШаблоны разработки ПО. Рефакторинг
Шаблоны разработки ПО. РефакторингSergey Nemchinsky
 
Java core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.pptJava core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.ppt
Anton Moiseenko
 

What's hot (8)

принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
 
Исключения и ошибки
Исключения и ошибкиИсключения и ошибки
Исключения и ошибки
 
Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.Парадигма объектно-ориентированного программирования.
Парадигма объектно-ориентированного программирования.
 
java 8
java 8java 8
java 8
 
Step 3.2
Step 3.2Step 3.2
Step 3.2
 
Шаблоны разработки ПО. Рефакторинг
Шаблоны разработки ПО. РефакторингШаблоны разработки ПО. Рефакторинг
Шаблоны разработки ПО. Рефакторинг
 
Java core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.pptJava core-lect6-part3-annotation.ppt
Java core-lect6-part3-annotation.ppt
 

Viewers also liked

Java. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередьJava. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередь
Unguryan Vitaliy
 
Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.
Unguryan Vitaliy
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
Unguryan Vitaliy
 
An Introduction to JVM Internals and Garbage Collection in Java
An Introduction to JVM Internals and Garbage Collection in JavaAn Introduction to JVM Internals and Garbage Collection in Java
An Introduction to JVM Internals and Garbage Collection in Java
Abhishek Asthana
 
List - списки
List - списки List - списки
List - списки
Unguryan Vitaliy
 
Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.
Unguryan Vitaliy
 
Алгоритмы поиска и сортировки
Алгоритмы  поиска и сортировкиАлгоритмы  поиска и сортировки
Алгоритмы поиска и сортировки
Unguryan Vitaliy
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью.
Unguryan Vitaliy
 
Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.
Unguryan Vitaliy
 
Java. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыJava. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторы
Unguryan Vitaliy
 
Java. Инкапсуляция.
Java. Инкапсуляция.Java. Инкапсуляция.
Java. Инкапсуляция.
Unguryan Vitaliy
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
Unguryan Vitaliy
 
Java. Циклы.
Java. Циклы.Java. Циклы.
Java. Циклы.
Unguryan Vitaliy
 
Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.
Unguryan Vitaliy
 
Java. Интерфейс Reference - типы ссылок
Java. Интерфейс Reference -  типы ссылокJava. Интерфейс Reference -  типы ссылок
Java. Интерфейс Reference - типы ссылок
Unguryan Vitaliy
 

Viewers also liked (15)

Java. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередьJava. Интерфейс Queue - очередь
Java. Интерфейс Queue - очередь
 
Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.Java. Логические операторы, операторы ветвления.
Java. Логические операторы, операторы ветвления.
 
Java. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операцииJava. Cистемы счислния, битовые операции
Java. Cистемы счислния, битовые операции
 
An Introduction to JVM Internals and Garbage Collection in Java
An Introduction to JVM Internals and Garbage Collection in JavaAn Introduction to JVM Internals and Garbage Collection in Java
An Introduction to JVM Internals and Garbage Collection in Java
 
List - списки
List - списки List - списки
List - списки
 
Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.Java. Массивы. Многомерные массивы.
Java. Массивы. Многомерные массивы.
 
Алгоритмы поиска и сортировки
Алгоритмы  поиска и сортировкиАлгоритмы  поиска и сортировки
Алгоритмы поиска и сортировки
 
Java. Сборщик мусора. Работа с памятью.
Java.  Сборщик мусора. Работа с памятью. Java.  Сборщик мусора. Работа с памятью.
Java. Сборщик мусора. Работа с памятью.
 
Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.Java. Интерфейс Set - наборы (множества) и его реализации.
Java. Интерфейс Set - наборы (множества) и его реализации.
 
Java. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторыJava. Переменные, типы данных, операторы
Java. Переменные, типы данных, операторы
 
Java. Инкапсуляция.
Java. Инкапсуляция.Java. Инкапсуляция.
Java. Инкапсуляция.
 
Java. Строки. Класс String.
Java. Строки. Класс String.Java. Строки. Класс String.
Java. Строки. Класс String.
 
Java. Циклы.
Java. Циклы.Java. Циклы.
Java. Циклы.
 
Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.Java. Интерфейс Map - ассоциативные массивы.
Java. Интерфейс Map - ассоциативные массивы.
 
Java. Интерфейс Reference - типы ссылок
Java. Интерфейс Reference -  типы ссылокJava. Интерфейс Reference -  типы ссылок
Java. Интерфейс Reference - типы ссылок
 

Similar to Java. Вложенные классы и интерфейсы.

Step 3.1
Step 3.1Step 3.1
Step 3.1
DmitryTrushkin
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5Technopark
 
Lec 2
Lec 2Lec 2
C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.
Igor Shkulipa
 
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Javaitc73
 
принципы объектного подхода
принципы объектного подходапринципы объектного подхода
принципы объектного подходаAndrey Radionov
 
Наследование и полиморфизм
Наследование и полиморфизмНаследование и полиморфизм
Наследование и полиморфизм
Ural Federal University named after First President of Russia B.N. Yeltsin
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classesMERA_school
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
Igor Shkulipa
 
Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.
Anton Moiseenko
 
C++ осень 2012 лекция 2
C++ осень 2012 лекция 2C++ осень 2012 лекция 2
C++ осень 2012 лекция 2Technopark
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3Technopark
 
C++ осень 2012 лекция 3
C++ осень 2012 лекция 3C++ осень 2012 лекция 3
C++ осень 2012 лекция 3Technopark
 
C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.
Igor Shkulipa
 

Similar to Java. Вложенные классы и интерфейсы. (16)

Step 3.1
Step 3.1Step 3.1
Step 3.1
 
Java. Classes.
Java. Classes.Java. Classes.
Java. Classes.
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
Lec 2
Lec 2Lec 2
Lec 2
 
C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.
 
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Java
 
принципы объектного подхода
принципы объектного подходапринципы объектного подхода
принципы объектного подхода
 
Наследование и полиморфизм
Наследование и полиморфизмНаследование и полиморфизм
Наследование и полиморфизм
 
3. java lecture classes
3. java lecture classes3. java lecture classes
3. java lecture classes
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.
 
C++ осень 2012 лекция 2
C++ осень 2012 лекция 2C++ осень 2012 лекция 2
C++ осень 2012 лекция 2
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3
 
C++ осень 2012 лекция 3
C++ осень 2012 лекция 3C++ осень 2012 лекция 3
C++ осень 2012 лекция 3
 
C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.
 

More from Unguryan Vitaliy

Модульное тестирование.
Модульное тестирование. Модульное тестирование.
Модульное тестирование.
Unguryan Vitaliy
 
Stream API
Stream APIStream API
Stream API
Unguryan Vitaliy
 
Архитектурный шаблон MVC
Архитектурный шаблон MVCАрхитектурный шаблон MVC
Архитектурный шаблон MVC
Unguryan Vitaliy
 
Работа в команде, управление программными проектами
Работа в команде, управление программными проектамиРабота в команде, управление программными проектами
Работа в команде, управление программными проектами
Unguryan Vitaliy
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версий
Unguryan Vitaliy
 
Принципы SOLID
Принципы SOLIDПринципы SOLID
Принципы SOLID
Unguryan Vitaliy
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
Unguryan Vitaliy
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoF
Unguryan Vitaliy
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
Unguryan Vitaliy
 
Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernate
Unguryan Vitaliy
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
Unguryan Vitaliy
 
Введение в Spring
Введение в SpringВведение в Spring
Введение в Spring
Unguryan Vitaliy
 
Cookies, session и другое в JSP
Cookies, session и другое в JSPCookies, session и другое в JSP
Cookies, session и другое в JSP
Unguryan Vitaliy
 
JSTL
JSTLJSTL
JSP
JSPJSP
JDBC
JDBCJDBC
Сервлеты
СервлетыСервлеты
Сервлеты
Unguryan Vitaliy
 
Сетевое взаимодействие
Сетевое взаимодействиеСетевое взаимодействие
Сетевое взаимодействие
Unguryan Vitaliy
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологии
Unguryan Vitaliy
 
XML
XMLXML

More from Unguryan Vitaliy (20)

Модульное тестирование.
Модульное тестирование. Модульное тестирование.
Модульное тестирование.
 
Stream API
Stream APIStream API
Stream API
 
Архитектурный шаблон MVC
Архитектурный шаблон MVCАрхитектурный шаблон MVC
Архитектурный шаблон MVC
 
Работа в команде, управление программными проектами
Работа в команде, управление программными проектамиРабота в команде, управление программными проектами
Работа в команде, управление программными проектами
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версий
 
Принципы SOLID
Принципы SOLIDПринципы SOLID
Принципы SOLID
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoF
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
 
Введение в hibernate
Введение в hibernateВведение в hibernate
Введение в hibernate
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
 
Введение в Spring
Введение в SpringВведение в Spring
Введение в Spring
 
Cookies, session и другое в JSP
Cookies, session и другое в JSPCookies, session и другое в JSP
Cookies, session и другое в JSP
 
JSTL
JSTLJSTL
JSTL
 
JSP
JSPJSP
JSP
 
JDBC
JDBCJDBC
JDBC
 
Сервлеты
СервлетыСервлеты
Сервлеты
 
Сетевое взаимодействие
Сетевое взаимодействиеСетевое взаимодействие
Сетевое взаимодействие
 
Введение в сетевые технологии
Введение в сетевые технологииВведение в сетевые технологии
Введение в сетевые технологии
 
XML
XMLXML
XML
 

Java. Вложенные классы и интерфейсы.

  • 2. Вложенный класс Вложенный класс - это класс, который объявлен внутри тела другого класса.
  • 3. Вложенные классы Вложенные классы делятся на два вида:  статические  не статические.
  • 4. Вложенные классы Вложенные классы, объявленные как статические называются вложенными статическими (static nested classes). Не статические называются внутренними (inner classes).
  • 5. Вложенные классы (nested) class OuterClass { ... static class NestedClass { ... } }
  • 6. Вложенные классы (inner) class OuterClass { ... class NestedClass { ... } }
  • 7. Доступ к переменным Статические — не имеют доступ к членам обрамляющего класса. Как и другие поля класса, вложенные классы могут быть объявлены как private, public, protected или package private.
  • 8. Доступ к переменным Не статические классы имеют доступ к полям обрамляющего класса, даже если они объявлены как private.
  • 9. Использование вложенных классов Это хороший способ группировки классов, которые используются только в одном месте: Если класс полезен (используется) только внутри одного класса, то логично будет держать их вместе. Вложение таких вспомогательных классов делает код более удобным.
  • 10. Использование вложенных классов Инкапсуляция: Допустим, есть два класса A и B, классу B требуется доступ к свойству класса A, которое может быть приватным. Вложение класса B в класс A решит эту проблему, более того сам класс B можно скрыть от внешнего использования.
  • 11. Использование вложенных классов Улучшение читаемости и обслуживаемости кода: Вложение малых классов в более высокоуровневые классы позволяет хранить код там, где он используется.
  • 12. Доступ к вложенным классам Доступ к вложенному классу осуществляется с помощью следующей конструкции: OuterClass.StaticNestedClass Синтаксис создания объекта вложенного класса: OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
  • 13. Внутренние классы Внутренние (не статические) классы, как переменные и методы связаны с объектом внешнего класса. Внутренние классы так же имеют прямой доступ к полям внешнего класса.
  • 14. Ограничения внутрених классов Внутренние классы не могут содержать в себе статические методы и поля. Внутри внутренних классов нельзя объявлять перечисления.
  • 15. Внутренние классы Внутренние классы не могут существовать без экземпляра внешнего.
  • 16. Создание объекта внутреннего класса Outer outerObject = new Outer(); Outer.Inner innerObject = outerObject.new Inner();
  • 17. Пример внутренних классов public class OuterClass { public void method() { ... } public class InnerClass { public void method() { ... } public void anotherMethod() { method(); } } }
  • 18. Затенение (shadowing) Если вы объявляете переменную (будь то параметр или свойство класса) в какой-либо области (например, вложенный класс или область метода) с именем уже занятым в данной области, то такое объявление «затеняет» предыдущее и вы не сможете обращаться напрямую к переменной по её имени.
  • 19. Пример затенения public class ShadowTest { public int x = 0; class FirstLevel { public int x = 1; void methodInFirstLevel(int x) { System.out.println("x = " + x); System.out.println("this.x = " + this.x); System.out.println("ShadowTest.this.x = " + ShadowTest.this.x); } }
  • 20. Пример затенения public static void main(String... args) { ShadowTest st = new ShadowTest(); ShadowTest.FirstLevel fl = st.new FirstLevel(); fl.methodInFirstLevel(23); } }
  • 21. Локальные классы Локальные классы похожи на внутренние: они не могут содержать статические поля или методы.
  • 22. Ограничения локальных классов У локальных классов есть множество ограничений: Они видны только в пределах блока, в котором объявлены; Вы не сможете объявить интерфейс внутри метода — интерфейсы статичны.
  • 23. Ограничения локальных классов Локальный класс может содержать статические поля, только если они константы. Они не могут быть объявлены как private, public, protected или static;
  • 24. Локальные классы На практике чаще всего объявление происходит в методе некоторого другого класса. Хотя объявлять локальный класс можно внутри статических и нестатических блоков инициализации.
  • 25. Анонимные классы Анонимные классы, в отличие от локальных, не имеют имени. В отличие от объявления обычных классов, объявление анонимных классов происходит внутри выражения. Используйте анонимные классы, если локальный класс нужен вам единожды. Анонимные классы часто используются в приложениях с графическим интерфейсом (GUI).
  • 26. Пример анонимного класса new Thread(new Runnable() { public void run() { ... } }).start();
  • 27. Синтаксис анонимного класса Определение анонимного класса содержит: Оператор new Имя интерфейса для реализации или класса для наследования. Скобки, также как и при создании обычных объектов. Можно реализовать интерфейс или абстрактный класс.
  • 28. Доступ к локальным переменным Анонимный класс имеет доступ к полям внешнего класса. Анонимный класс не имеет доступ локальным переменным области, в которой он определен, если они не финальные (final) или неизменяемые (effectively final). Как и у других внутренних классов, объявление переменной с именем, которое уже занято, затеняет предыдущее объявление.
  • 29. Ограничения анонимных классов Нельзя определять статические члены анонимного класса. Анонимный класс может содержать статические поля, если это константы. Анонимные классы также могут содержать в себе локальные классы. Конструктора в анонимном классе быть не может.
  • 30. Использование final для классов Класс с final не может подразделяться на подклассы. От такого класса нельзя наследоваться. Если класс объявлен final и abstract (взаимоисключающие понятия), произойдет ошибка компиляции
  • 31. Использование final для методов Метод с final не может быть переопределен в наследнике. Аргументы методов, обозначенные как final, предназначены только для чтения, при попытке изменения будет ошибка компиляции.
  • 32. Использование final для переменных Переменные final не инициализируются по умолчанию, им необходимо явно присвоить значение при объявлении или в конструкторе, иначе – ошибка компиляции. Если final переменная содержит ссылку на объект, объект может быть изменен, но переменная всегда будет ссылаться на тот же самый объект
  • 33. Вложенные интерфейсы Интерфейс может быть объявлен членом класса или другого интерфейса. Такой интерфейс называется интерфейсом-членом или вложенным интерфейсом. Вложенный интерфейс может быть объявлен как public, private или protected.
  • 34. Пример вложенного интерфейса class A { interface B { void f(); } public class C implements B { public void f() {} } private class D implements B { public void f() {} } }
  • 35. Вложенные в интерфейсы классы. Вложенный (nested) в интерфейс класс является открытым (public) и статическим (static) даже без явного указания этих модификаторов. Помещая класс внутрь интерфейса, мы показываем, что он является неотъемлемой частью API этого интерфейса и более нигде не используется.
  • 36. interface Colorable { public Color getColor(); public static class Color { private int red, green, blue; Color(int red, int green, int blue) { this.red = red; this.green = green; this.blue = blue; }
  • 37. int getRed() { return red; } int getGreen() { return green; } int getBlue() { return blue; } } } class Triangle implements Colorable { private Color color; // ... @Override public Color getColor() { return color; } }
  • 38. Использование Colorable.Color color = new Colorable.Color(0, 0, 0); color = new Triangle.Color(255, 255, 255);