Лекция 2 (Classes).ppt
- Количество слайдов: 48
Язык программирования JAVA Пакеты Управление доступом
Пакеты n n Пакет – специальная структура для группировки логически связанных классов. Состоит из файлов классов и каталогов файловой системы Пространство имен используется для идентификации загружаемых классов. Имена классов должны быть уникальны в одном пространстве имен
Группировка классов в пакеты n n Для включения класса в пакет достаточно прописать имя пакета в разделе package определения класса Если пакет явно не задан, то класс принадлежит к «пакету по умолчанию» Для создания структуры каталогов используется опция –d компилятора javac Для запуска метода main() класса определенного пакета необходимо указать: ¡ ¡ CLASSPATH, указывающей на тот каталог, в котором находится класс Имя класса должно быть полным, т. е. предваряться именем пакета
Пример package ru. vsu. cs. java; public class Square{. . . } c: > javac –d c: javaprojectsbin Square. java c: javaprojectsbin ru vsu cs java Square. class c: javaprojectsbin > java ru. vsu. cs. java. Square
Пакеты и CLASSPATH n В CLASSPATH нужно включать каталог верхнего уровня, от которого начинается структура каталогов пакета c: javaprojectsbin ru vsu cs java Square. class c: > SET CLASSPATH=C: javaprojectsbin
Управление доступом n Java контролирует доступ к классам, свойствам и методам через использование модификаторов доступа ¡ ¡ private protected public нет модификатора
Управление доступом n Класс ¡ n Свойство ¡ n public или нет модификатора (private) private, protected, public, нет Метод ¡ private, protected, public, нет
Управление доступом Private No modifier Protected Public Не подкласс в том же пакете Подкласс в другом пакете Не подкласс в другом пакете Тот же класс Подкласс в том же пакете
Управление доступом n Методы имеют доступ ко всем private полям не только класса, но и объекта своего класса! public class Square{ private int line. Width; public boolean bigger. Than. Two(Square sq){ return sq. line. Width > 2; } }
Язык программирования JAVA Наследование Абстрактные классы Интерфейсы
Наследование n Свойство объекта, заключающееся в том, что характеристики одного объекта (объектапредка) могут передаваться другому объекту (объектупотомку) без их повторного описания.
Синтаксис public class Super. Class { … } public class Sub. Class extends Super. Class { … }
Наследование свойств и методов n n Подкласс наследует все свойства и методы родителя Доступ из потомка к private свойствам родителя не разрешен
Наследование n Базовым классом для всех классов является Object ¡ ¡ ¡ equals() finalize() hash. Code() to. String() clone() get. Class()
Метод equals() n n n Метод предназначен для сравнения двух объектов на равенство При сравнении с использованием == сравнивается равенство адресов объектов Строка – объект ¡ ¡ “abc” == “abc”. equals(“абц”)
Метод finalize() n n n Если объект работает с ресурсами, то он должен освободить эти ресурсы перед тем, как он будет удален из памяти Для этого используется метод finalize() Метод вызывается перед тем, как объект будет убран из памяти Время, когда будет вызван finalize() не определено finalize() – это НЕ ДЕСТРУКТОР
Процесс создания экземпляра подкласса n n Подкласс не наследует конструкторы суперкласса Если для под- и суперкласса не указаны конструкторы: ¡ ¡ Сначала вызывается конструктор по умолчанию для суперкласса Затем для подкласса
super n n n Ссылка на базовый класс Часто используется в конструкторах Вызов super() должен быть первым оператором в конструкторе public class Super. Class { public Super. Class(int i){ property = i; } } public class Sub. Class extends Super. Class { public Sub. Class(int i){ super(i); } }
Перекрытие методов n n n Методы суперкласса могут быть перекрыты в подклассе Метод считается перекрытым в подклассе , если он имеет такую же сигнатуру, что и в суперклассе Область видимости метода подкласса должна быть не ниже области видимости метода суперкласса
Вызов методов суперкласса Методы суперкласса вызываются при помощи super. имя. Метода() n public class Super. Class {. . . public String get. Summary(){. . . } } public class Sub. Class extends Super. Class { public String get. Summary(){. . . s = super. get. Summary(); . . . } }
Подкласс == Суперкласс ? n n Можно присваивать переменной суперкласса ссылку на подкласс При вызове методов суперкласса выполняются методы подкласса (полиморфизм) public static void main (String[] args){. . . Super. Class s = new Sub. Class(); s. get. Summary(); . . . }
Полиморфизм public class Super. Class{ public void say. Hello(){ System. out. println(“Hello!”); } } public class Sub. Class extends Super. Class{ public void say. Hello(){ System. out. println(“Hi!”); } }. . . Super. Class s = new Sub. Class(); s. say. Hello(); . . . Hi!
Динамическое связывание n Автоматический выбор нужного метода во время выполнения программы.
Порядок выполнения вызова метода n Предположим, что вызывается метод с именем my. Method(arg 1) объекта x класса С ¡ Определяются все методы с именем my. Method ¡ Определяются методы с нужными сигнатурами (при необходимости производится приведение типов) ¡ Если метод private, static, final или конструктор, то его адрес известен заранее, производится статическое связывание ¡ В противном случае вызывается версия метода, соответствующая ФАКТИЧЕСКОМУ типу объекта, на который ссылается переменная x ¡ Для ускорения поиска таблица адресов методов строится заранее
Оператор instanceof n n Класс объекта может быть определен при помощи оператора instanceof Объектная ссылка может быть приведена к нужному типу public static void main (String[] args){. . . Super. Class s = new Sub. Class(); s. get. Summary(); . . . if (s instanceof Sub. Class){ Sub. Class sc = (Sub. Class) s; // ((Sub. Class) s). do. Sub. Class. Method(); sc. do. Sub. Class. Method(); } }
Модификатор final n n Модификатор final запрещает наследование классов и перекрытие методов (в подклассе не может быть создан метод с такой же сигнатурой) Причины использования final ¡ ¡ Скорость выполнения Безопасность
Абстрактные классы n n Абстрактные классы используются как основа для создания «реальных» классов Нельзя создать экземпляр абстрактного класса
Синтаксис public abstract class Person{. . . public String get. Summary(){. . . } } public class Employee extends Person{. . . }
Абстрактные методы n Методы, не имеющие реализации ¡ ¡ ¡ Заготовка для последующей реализации Могут быть только в абстрактных классах Должны быть реализованы в неабстрактных подклассах
Синтаксис public abstract class Person{. . . public abstract float get. Salary(); } public class Employee extends Person{. . . public float get. Salary(){ return salary+salary*0. 1; } }
Интерфейс n n n Подобен полностью абстрактному классу Интерфейс – список заголовком методов без реализации Нельзя создать экземпляр интерфейса Класс может реализовывать один или несколько интерфейсов Обычно именуются существительным с «able» : Comparable, Cloneable и т. д.
Синтаксис public interface Writable{ int MAX=400; . . . String interface. Method(String s); . . . } n n Все методы – public abstract Все свойства – public static final
Использование public class New. Class extends My. Class implements Writable{. . . public String interface. Method(String s){. . . } n Методы интерфейса должны иметь реализацию (исключение – абстрактные классы)
Использование Абстрактные классы и интерфейсы могут быть использованы как типы аргументов и методов n public class New. Class extends My. Class implements Writable{. . . } public class SClass {. . . public Writable s. Method(){ return new New. Class(); } }
Оператор instanceof n n Оператор используется для проверки того, что класс реализует заданный интерфейс Возможно приведение к типу интерфейса с последующим возовом метода
Язык программирования JAVA Внутренние классы
Внутренние классы n n Классы объявленные внутри других классов Четыре типа внутренних классов ¡ ¡ Статические Классы-свойства Локальные Анонимные
Объявление статического внутреннего класса n n Определяется на уровне класса Имеет доступ только к статическим свойствам и методам внешнего класса public class Outer{ private static float var. Float = 3. 50 f; private String var. String; . . . static class Inner. Static{ var. Float = 4. 51 f; . . . } }
Объявление внутреннего класса -свойства n n n Определяется на уровне класса Необходим экземпляр внешнего класса Для доступа к экземпляру внешнего класса используется this public class Outer extends Super. Class{ private static float var. Float = 3. 50 f; private String var. String; . . . class Inner. Member{ var. Float = 4. 51 f; . . . Outer. this. var. String = “Hi, outer!”; Outer. super. set. Int. Property(23); } }
Внутренний класс-свойство n n n Применяется как «окно» в структуру класса Для передачи параметров Для реализации интерфейсов (обработка событий)
Объявление внутреннего локального класса Определяется в методе Доступ только к final переменным Нет конструктора Не может иметь статических свойств и методов n n public class Outer extends Super. Class{ public void outer. Method (final int param 1){ final int var 1 = 4; class Inner. Local{ private int local. Var = param 1+var 1; } Inner. Local inner. Loc = new Inner. Local(); }
Объявление анонимных внутренних классов Определяются на уровне метода Ключевые слова class, extends, implements не используются Нет конструктора n n n public class Outer extends Super. Class{ public void outer. Method (){ Comparable c = new Comparable(){ public int compare. To(Object o){. . . } } c. compare. To(local. Var); } }
Компиляция n Внутренние классы компилируются в файлы. class вида: Outer. Class$Inner. Class. class
Преимущества использования внутренних классов n n Внутренний класс имеет доступ к закрытым данным внешнего класса Внутренний класс можно скрыть от других классов того же пакета Удобны при создании программ, реагирующих на события Безымянные классы применяются при реализации обратных (callback) вызовов
Использование внутренних классов Обработчики событий ¡ Внутренние классы, реализующие интерфейс Action. Listener, часто используются в качестве обработчиков событий
Пример (обработчик закрытия окна) import java. awt. event. *; import javax. swing. *; public class My. Frame extends JFrame { public My. Frame() { super(); add. Window. Listener(new Window. Adapter() { public void window. Closing(Window. Event we) { System. exit(0); } }
Пример (обратный вызов) import java. awt. event. Action. Event; import java. awt. event. Action. Listener; import java. util. Date; import javax. swing. JOption. Pane; import javax. swing. Timer; public class Timer. Printer { public static void main(String[] args) { Action. Listener listener = new Action. Listener(){ public void action. Performed(Action. Event event){ System. out. println(new Date()); } }; JOption. Pane. show. Message. Dialog(null, "Hi"); Timer t = new Timer (1000, listener); t. start(); } }
Вопросы?