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

PPT
Java. Конструкторы класса и инициализация
Unguryan Vitaliy
 
PPT
Java. Generic - шаблонные типы.
Unguryan Vitaliy
 
PPT
Java. Наследование.
Unguryan Vitaliy
 
PPT
Java. Полиморфизм.
Unguryan Vitaliy
 
PPT
Рефлексия в java
Unguryan Vitaliy
 
PPT
Java. Методы
Unguryan Vitaliy
 
PPT
Java. Введение в коллекции. Классы обертки. Перечисленияю
Unguryan Vitaliy
 
Java. Конструкторы класса и инициализация
Unguryan Vitaliy
 
Java. Generic - шаблонные типы.
Unguryan Vitaliy
 
Java. Наследование.
Unguryan Vitaliy
 
Java. Полиморфизм.
Unguryan Vitaliy
 
Рефлексия в java
Unguryan Vitaliy
 
Java. Методы
Unguryan Vitaliy
 
Java. Введение в коллекции. Классы обертки. Перечисленияю
Unguryan Vitaliy
 

What's hot (8)

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

Viewers also liked (15)

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

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

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

More from Unguryan Vitaliy (20)

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

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);