SlideShare a Scribd company logo
1 of 19
Язык программирования
JAVA
Лекция# 3 (Часть 1)
Внутренние классы. Абстрактные
классы. Интерфейсы.
Моисеенко Антон
canggu@mail.ru
СПГУАП
Кафедра Информационно-Сетевых Технологий
Содержание курса
■ Внутренние классы
■ Интерфейсы
■ Aбстрактные классы
Внутренние классы
■ Класс, описанный внутри другого класса
называется внутренним
■ Может быть использован для
• удобства
• ограничения области его видимости
• и для сокрытия реализации
Внутренние классы (cont.)
Тело внутреннего класса содержится в теле другого класса
public class DragonFlying {
class Speed { //внутренний класс
private int i = 100;
public int value(){ return i; }
}
class Destination {//внутренний класс
private String label;
Destination(String whereTo){
label = whereTo;
}
String readLabel(){ return label;}
}
}
Внутренние классы (cont.)
Внешний класс имеет доступ ко внутренним и может создавать его
экземпляры
public void ship(String dest){
Speed s = new Speed();
Destination d = new Destination(dest);
System.out.println(d.readLabel());
}
public static void main(String[] args) {
DragonFlying f1 = new DragonFlying();
f1.ship("Tanzania");
}
Внутренние классы (cont.)
Внутренний класс может быть доступен и снаружи
public class DragonFlying {
public Destination to(String s) {//может быть возвращен
внутренний класс
return new Destination(s);
}
public Speed speed() {
return new Speed();
}
…
}
…
DragonFlying f = new DragonFlying();
DragonFlying.Speed s = f.speed(); //используется
префикс содержащего класса
DragonFlying.Destination d = f.to("Borneo");
Типичное использование
внутреннего класса
Внутренний класс реализует некий публичный интерфейс
public interface Destination {
String readLabel();
}
public interface Speed {
int value();
}
Типичное использование
внутреннего класса (cont.)
Реализация остается закрытой
public class DragonFlying {
private class DFSpeed implements Speed {
private int i = 11;
public int value() { return i; }
}
protected class DFDestination implements
Destination {
private String label;
private DFDestination(String whereTo) {
label = whereTo;
}
public String readLabel() { return label; }
}
}
Типичное использование
внутреннего класса (cont.)
Наружу доступен только публично известный интерфейс
public Destination dest(String s){
return new DFDestination(s);
}
public Speed speed() {
return new DFSpeed();
}
Типичное использование
внутреннего класса (cont.)
Клиент может взаимодействовать только с публичным интерфейсом
class Test {
public static void main(String[] args) {
DragonFlying df = new DragonFlying();
Speed s = df.speed();
Destination d = df.dest("Tanzania");
// Незаконно - нельзя получить доступ к
private классу:
DragonFlying.DFSpeed dfs = df.new
DFSpeed();
}
}
Внутренний класс в
случайном контексте
Класс может быть определен даже в теле метода
private void internalTracking(boolean b) {
if(b) {
class TrackingSlip {
private String id;
TrackingSlip(String s) { id = s; }
String getSlip() { return id; }
}
TrackingSlip ts = new TrackingSlip("slip");
String s = ts.getSlip();
}
//Нельзя его здесь использовать! Вне контекста:
//! TrackingSlip ts = new TrackingSlip("x");
}
Внутренний класс в JDK
Анонимный внутренний класс может быть определен в
теле метода
private void doOnSeparateThread() {
EventQueue.invokeLater(new Runnable(){
public void run(){
System.out.println(“Executing on Event
Dispatching Thread”);
}
});
}
Абстрактный класс
■ Класс является абстрактным, если имеет модификатор abstract
■ Класс должен быть помечен этим модификатором, если у него
хоть один абстрактный метод (помечен словом abstract и не
имеет реализации)
abstract class FlyingThing {
protected String name;
abstract public void fly();
public String getName(){
return name;
}
}
//ошибка,абстрактный класс не может иметь реализаций
FlyingThing aThing = new FlyingSomething();
Наследование от
абстрактного класса
Как правило, абстрактный класс служит для создания базы дерева
наследования классов
class Dragon extends FlyingSomething{
public fly(){
flySomewhere();//реализуем полет куда-
нибудь
}
}
//ОК – создавать экземпляры можно
Dragon d = new Dragon();
//ОК – создание ссылки на абстрактный класс и
инициализация конкретным классом
FlyingSomething fs = new Dragon();
Реализация интерфейса
Интерфейс – это сущность, предназначен для формирования
структуры реализующего его класса или для наследования другим
интерфейсом
public interface Flying{
// класс, реализующий данный интерфейс,
// должен предоставить реализацию для
// этого метода
int speed();
}
Реализация интерфейса (cont.)
■ Класс может реализовывать множество
интерфейсов
■ Реализующий класс должен реализовать все
методы интерфейса
■ Интерфейсы могу наследоваться друг от друга
interface
Flying
long distance()
long height()
int speed()
void fly()
class Bird
long distance()
long height()
int speed()
void fly()
class Dragon
long distance()
long height()
int speed()
void fly()
class
RedDragon
long distance()
int speed()
void fly()
Реализация интерфейса (cont.)
Реализация позволяет снабдить класс дополнительными свойствами
public class Dragon implements Flying {
protected int speed;
public int speed(){
return speed;
}
}
public class RedDragon extends Dragon{
public int speed(){
return 2*speed;
}
public long distance(){…}
public long burn(Object obj){…}
}
Ссылки
■ Учебник (раздел про внутренние классы):
• http://java.sun.com/docs/books/tutorial/java/javaOO
/innerclasses.html
Вопросы?

More Related Content

What's hot

C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
Technopark
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
metaform
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
Technopark
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5
Technopark
 

What's hot (15)

Наследование и полиморфизм
Наследование и полиморфизмНаследование и полиморфизм
Наследование и полиморфизм
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.
 
Лекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследованиеЛекция 6_принципы ООП : инкапсуляция, наследование
Лекция 6_принципы ООП : инкапсуляция, наследование
 
Java: вчера, сегодня, завтра
Java: вчера, сегодня, завтраJava: вчера, сегодня, завтра
Java: вчера, сегодня, завтра
 
C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.
 
принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.C++ STL & Qt. Занятие 03.
C++ STL & Qt. Занятие 03.
 
C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.C++ STL & Qt. Занятие 08.
C++ STL & Qt. Занятие 08.
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
 
C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5
 

Similar to Java Core. Lecture# 3. Part# 1. Abstract classes.

Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Java
itc73
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
Noveo
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
Technopark
 
C++ осень 2012 лекция 3
C++ осень 2012 лекция 3C++ осень 2012 лекция 3
C++ осень 2012 лекция 3
Technopark
 
C++ осень 2012 лекция 2
C++ осень 2012 лекция 2C++ осень 2012 лекция 2
C++ осень 2012 лекция 2
Technopark
 
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3
Technopark
 
Lecture5
Lecture5Lecture5
Lecture5
orgil
 

Similar to Java Core. Lecture# 3. Part# 1. Abstract classes. (20)

Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Java
 
Lec 2
Lec 2Lec 2
Lec 2
 
Bytecode
BytecodeBytecode
Bytecode
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
C++ Базовый. Занятие 10.
C++ Базовый. Занятие 10.C++ Базовый. Занятие 10.
C++ Базовый. Занятие 10.
 
C++ осень 2012 лекция 3
C++ осень 2012 лекция 3C++ осень 2012 лекция 3
C++ осень 2012 лекция 3
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.generics
 
Step 3.2
Step 3.2Step 3.2
Step 3.2
 
Step 3.1
Step 3.1Step 3.1
Step 3.1
 
C++ осень 2012 лекция 2
C++ осень 2012 лекция 2C++ осень 2012 лекция 2
C++ осень 2012 лекция 2
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Java. OOP
Java. OOPJava. OOP
Java. OOP
 
Doctrine 2
Doctrine 2Doctrine 2
Doctrine 2
 
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3
 
Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»
Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»
Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»
 
Lecture5
Lecture5Lecture5
Lecture5
 
Java. Classes.
Java. Classes.Java. Classes.
Java. Classes.
 
Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.Java. Вложенные классы и интерфейсы.
Java. Вложенные классы и интерфейсы.
 

Java Core. Lecture# 3. Part# 1. Abstract classes.

  • 1. Язык программирования JAVA Лекция# 3 (Часть 1) Внутренние классы. Абстрактные классы. Интерфейсы. Моисеенко Антон canggu@mail.ru СПГУАП Кафедра Информационно-Сетевых Технологий
  • 2. Содержание курса ■ Внутренние классы ■ Интерфейсы ■ Aбстрактные классы
  • 3. Внутренние классы ■ Класс, описанный внутри другого класса называется внутренним ■ Может быть использован для • удобства • ограничения области его видимости • и для сокрытия реализации
  • 4. Внутренние классы (cont.) Тело внутреннего класса содержится в теле другого класса public class DragonFlying { class Speed { //внутренний класс private int i = 100; public int value(){ return i; } } class Destination {//внутренний класс private String label; Destination(String whereTo){ label = whereTo; } String readLabel(){ return label;} } }
  • 5. Внутренние классы (cont.) Внешний класс имеет доступ ко внутренним и может создавать его экземпляры public void ship(String dest){ Speed s = new Speed(); Destination d = new Destination(dest); System.out.println(d.readLabel()); } public static void main(String[] args) { DragonFlying f1 = new DragonFlying(); f1.ship("Tanzania"); }
  • 6. Внутренние классы (cont.) Внутренний класс может быть доступен и снаружи public class DragonFlying { public Destination to(String s) {//может быть возвращен внутренний класс return new Destination(s); } public Speed speed() { return new Speed(); } … } … DragonFlying f = new DragonFlying(); DragonFlying.Speed s = f.speed(); //используется префикс содержащего класса DragonFlying.Destination d = f.to("Borneo");
  • 7. Типичное использование внутреннего класса Внутренний класс реализует некий публичный интерфейс public interface Destination { String readLabel(); } public interface Speed { int value(); }
  • 8. Типичное использование внутреннего класса (cont.) Реализация остается закрытой public class DragonFlying { private class DFSpeed implements Speed { private int i = 11; public int value() { return i; } } protected class DFDestination implements Destination { private String label; private DFDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } }
  • 9. Типичное использование внутреннего класса (cont.) Наружу доступен только публично известный интерфейс public Destination dest(String s){ return new DFDestination(s); } public Speed speed() { return new DFSpeed(); }
  • 10. Типичное использование внутреннего класса (cont.) Клиент может взаимодействовать только с публичным интерфейсом class Test { public static void main(String[] args) { DragonFlying df = new DragonFlying(); Speed s = df.speed(); Destination d = df.dest("Tanzania"); // Незаконно - нельзя получить доступ к private классу: DragonFlying.DFSpeed dfs = df.new DFSpeed(); } }
  • 11. Внутренний класс в случайном контексте Класс может быть определен даже в теле метода private void internalTracking(boolean b) { if(b) { class TrackingSlip { private String id; TrackingSlip(String s) { id = s; } String getSlip() { return id; } } TrackingSlip ts = new TrackingSlip("slip"); String s = ts.getSlip(); } //Нельзя его здесь использовать! Вне контекста: //! TrackingSlip ts = new TrackingSlip("x"); }
  • 12. Внутренний класс в JDK Анонимный внутренний класс может быть определен в теле метода private void doOnSeparateThread() { EventQueue.invokeLater(new Runnable(){ public void run(){ System.out.println(“Executing on Event Dispatching Thread”); } }); }
  • 13. Абстрактный класс ■ Класс является абстрактным, если имеет модификатор abstract ■ Класс должен быть помечен этим модификатором, если у него хоть один абстрактный метод (помечен словом abstract и не имеет реализации) abstract class FlyingThing { protected String name; abstract public void fly(); public String getName(){ return name; } } //ошибка,абстрактный класс не может иметь реализаций FlyingThing aThing = new FlyingSomething();
  • 14. Наследование от абстрактного класса Как правило, абстрактный класс служит для создания базы дерева наследования классов class Dragon extends FlyingSomething{ public fly(){ flySomewhere();//реализуем полет куда- нибудь } } //ОК – создавать экземпляры можно Dragon d = new Dragon(); //ОК – создание ссылки на абстрактный класс и инициализация конкретным классом FlyingSomething fs = new Dragon();
  • 15. Реализация интерфейса Интерфейс – это сущность, предназначен для формирования структуры реализующего его класса или для наследования другим интерфейсом public interface Flying{ // класс, реализующий данный интерфейс, // должен предоставить реализацию для // этого метода int speed(); }
  • 16. Реализация интерфейса (cont.) ■ Класс может реализовывать множество интерфейсов ■ Реализующий класс должен реализовать все методы интерфейса ■ Интерфейсы могу наследоваться друг от друга interface Flying long distance() long height() int speed() void fly() class Bird long distance() long height() int speed() void fly() class Dragon long distance() long height() int speed() void fly() class RedDragon long distance() int speed() void fly()
  • 17. Реализация интерфейса (cont.) Реализация позволяет снабдить класс дополнительными свойствами public class Dragon implements Flying { protected int speed; public int speed(){ return speed; } } public class RedDragon extends Dragon{ public int speed(){ return 2*speed; } public long distance(){…} public long burn(Object obj){…} }
  • 18. Ссылки ■ Учебник (раздел про внутренние классы): • http://java.sun.com/docs/books/tutorial/java/javaOO /innerclasses.html