Слайд 2Описание класса
[модификаторы] class ИмяНовогоКласса [extends ИмяСупер-КлассаБазового класса] [implements список Интерфейсов]
{Тело
класса, состоящее из описаний элементов класса}
Модификаторы доступа - public, protected, private, package-private (default по умолчанию - уровень пакета)
Модификаторы использования - final, abstract, static
Слайд 3Доступность данных и методов класса в зависимости от места их размещения
Компоненты
класса, объявленные как private, доступны только в своем классе.
Компоненты класса доступны из другого класса того же пакета, если они не объявлены как private.
Компонент класса A доступен из класса B, входящего в другой пакет, в тех случаях, когда класс A, равно как и его компонент, объявлены как public, или когда класс A объявлен как public, компонент класса объявлен как protected, а класс B является подклассом класса A.
Слайд 4Модификаторы использования класса
final - класс не может быть расширен (не может быть
базовым )
abstract - класс не предназначен для создания объектов. Абстрактный класс может использоваться только как базовый для классов-наследников. Класс, содержащий хотя бы один абстрактный метод, должен быть объявлен абстрактным. Модификаторы final и abstract несовместимы.
static – используется для вложенных классов, в которых имеются статические переменные и методы.
Слайд 5Перечисление – это класс
enum Season {WINTER, SRRING, SUMMER, AUTUMN}
Эквивалентно:
class Season extends java.lang.Enum
{WINTER, SRRING, SUMMER, AUTUMN}
Экземпляры enum-класса имеют права по умолчанию, доступны статически и наследуют методы:
— name() — имя константы в виде строки
— ordinal() — порядок константы (соответствует порядку, в котором объвлены константы)
— values() — возвращает массив всех значений перечисления;
Season season = Season. WINTER;
System.out.println(“Вывод =”+season.name());
Вывод= WINTER
Слайд 6Переменные класса
Описание переменной выполняется по следующей схеме:
[модификаторы] Тип ИмяПеременной [=значение];
Модификаторами
могут быть :
• любой из модификаторов доступа: public,protected,private, иначе уровень доступа переменной устанавливается по умолчанию пакетным.
• static – модификатор принадлежности – переменные, отмеченные этим модификатором, принадлежат классу, а не экземпляру класса и существуют в единственном числе для всех его объектов, создаются JVM в момент первого обращения к классу, допускают обращение до создание объекта класса
Обращение: Имя класса.Имя компонента
• final – переменная не может изменять своего начального значения, то есть, является именованной константой.
• transient – переменная не должна сохранять и восстанавливать значение при сериализации (записи в файл) объекта. Все статические переменные являются несохраняемыми автоматически.
• volatile – Используется в многопоточном программировании. Сообщает компилятору, что к полю могут одновременно обращаться несколько потоков текущего процесса. Запрещает оптимизирующему компилятору использовать ее копии, размещаемые в регистрах и кэшах процессоров.
Слайд 7
Инициализация полей в Java
Инициализация статических полей и блоков выполняется при загрузке класса
Инициализация
не статических элементов выполняется при создании объекта (при вызове конструктора)
Порядок инициализации полей
инициализация статических полей в месте объявления и в инициализационном блоке происходит до инициализации в конструкторе
инициализации полей в месте объявления и в инициализационных блоках выполняются в порядке их объявления в классе
инициализация полей базового класса происходит полностью до инициализации производного класса, т.е. сначала выполняются все инициализаторы базового класса, а потом все инициализаторы производного класса.
Слайд 8Пример инициализации полей
public class ClassFieldsInitOrder {
int i0=1;
static int i1 =
initialize(“i1");
static int i2;
static { i2 = initialize("i2"); }
static int i3 = initialize(“i3");
static int i4;
static { i4 = initialize("i4"); }
static int initialize(String name) { System.out.println(name); return 0; }
public static void main(String[] args) {
System.out.println(“i0=“+i0+“ i1=”+i1+” i2=“+i2+” i3=”+i3+”i4=”+i4);
}
}
i1 i2 i3 i4 // при загрузке класса
i0=1 i1=0 i2=0 i3=0 i4=0 // при выполнении метода main
Слайд 9Методы класса
[модификаторы] ТипВозвращаемогоЗначения ИмяМетода (список Параметров) [throws списокВыбрасываемыхИсключений] { Тело метода};
Модификаторами
могут быть
• любой из модификаторов доступа: public,protected,private, иначе уровень доступа метода устанавливается по умолчанию пакетным.
• static – модификатор принадлежности – методы, отмеченные этим модификатором, принадлежат классу и доступны до создания объектов. Статические методы могут оперировать только статическими переменными или локальными переменными, объявленными внутри метода. Статический метод не может быть переопределен.
class A {
. . .
public static void main(String[] args) { . . . } – программа загружается как класс java A, а не как объект. Затем вызывается метод A.main (args)
• final – метод не может быть переопределен при наследовании класса.
• synchronized – при исполнении метода не может произойти переключение конкурирующих потоков
• abstract – нереализованный метод. Тело такого метода просто отсутствует. Если объявили некий метод класса абстрактным, то и весь класс надо объявить абстрактным.
Слайд 10Назначение конструкторов
Конструктор – это метод, назначение которого состоит в создании экземпляра класса.
Характеристики
конструктора:
Имя конструктора должно совпадать с именем класса;
Если в классе не описан конструктор, компилятор автоматически добавляет в код конструктор по умолчанию;
Конструктор не может быть вызван иначе как оператором new;
Конструктор не имеет возвращаемого значения – так как он возвращает ссылку на создаваемый объект (допускается оператор return, но только пустой).
Конструкторов может быть несколько в классе. В этом случае конструкторы называют перегруженными;
Слайд 11Отличие конструкторов от методов
Слайд 13Последовательность действий при вызове конструктора
1. Все поля данных инициализируются своими значениями, предусмотренными
по умолчанию (0, false или null).
2. Инициализаторы всех полей и блоки инициализации выполняются в порядке их перечисления в объявлении класса.
3. Если в первой строке конструктора вызывается другой конструктор, то выполняется вызванный конструктор.
4. Выполняется тело конструктора.
Слайд 14Конструкторы по умолчанию
public class Konstr {
int width; // ширина коробки
int height;
// высота коробки
int depth; // глубина коробки
// вычисляем объём коробки
int getVolume() {
return width * height * depth;
}
public static void main(String[] args) {
Konstr kons=new Konstr(); // вызов конструктора по умолчанию
System.out.println("Объём коробки: " + kons.getVolume());
}
}
Всем переменным присваивается значения по умолчанию (0)
Объём коробки: 0
Слайд 15Конструктор без параметров
public class Konstr {
int width; // ширина коробки
int height;
// высота коробки
int depth; // глубина коробки
Konstr() { // конструктор без параметров
width = 10;
height = 10;
depth = 10;
}
// вычисляем объём коробки
int getVolume() {
return width * height * depth;
}
public static void main(String[] args) {
Konstr kons=new Konstr(); // вызов конструктора без параметров
System.out.println("Объём коробки: " + kons.getVolume());
}
}
Объём коробки: 1000
Слайд 16Конструктор с параметрами
public class Konstr {
int width; // ширина коробки
int height;
// высота коробки
int depth; // глубина коробки
Konstr(int w, int h, int d) {// конструктор с параметрами
width = w;
height = h;
depth = d;
}
// вычисляем объём коробки
int getVolume() {
return width * height * depth;
}
public static void main(String[] args) {
Konstr kons=new Konstr(5,5,5); // вызов конструктора с параметрами
System.out.println("Объём коробки: " + kons.getVolume());
Konstr kons1=new Konst(); // ошибка, конструктор не определен
}
}
Объём коробки: 125
Слайд 17Перегрузка конструкторов
Konstr() { // конструктор без параметров
width = 10;
height
= 10;
depth = 10;
}
Konstr(int w, int h, int d) { // конструктор с параметрами
width = w;
height = h;
depth = d;
}
public static void main(String[] args) {
Konstr kons1=new Konstr(); // вызов конструктора без параметров
System.out.println("Объём стандартной коробки: " + kons1.getVolume());
Konstr kons2=new Konstr(5,5,5); // вызов конструктора с параметрами
System.out.println("Объём нестандартной коробки: " + kons2.getVolume());
}
Объём стандартной коробки: 1000
Объём нестандартной коробки: 125
Слайд 18Конструктор копирования
Konstr(int w, int h, int d) { // конструктор с параметрами
width = w;
height = h;
depth = d;
}
Konstr(Konstr ob) { // конструктор копирования
width = ob.width;
height = ob.height;
depth = ob.depth;
}
public static void main(String[] args) {
Konstr kons2=new Konstr(7,7,7); // вызов конструктора с параметрами
Konstr kons1=new Konstr(kons2); // вызов конструктора копирования
System.out.println("Объём новой коробки: " + kons1.getVolume());
}
Объём новой коробки: 343
Слайд 19Вызов перегруженных конструкторов через this()
Konstr(int w, int h, int d) { //
конструктор с 3 параметрами
width = w;
height = h;
depth = d;
}
Konstr(int i) { // конструктор с 1 параметром
/* Вызов конструктора this() должен быть первым оператором в конструкторе.*/
this (i,i,i); вызов конструктора с 3 параметрами
width++;
height--;
depth ++;
}
public static void main(String[] args) {
Konstr kons=new Konstr(3); // вызов конструктора с 1 параметром
System.out.println("Объём коробки: " + kons.getVolume());
}
Объём коробки: 32