Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Заочники 2020-2021 / Лекция 4.ppt
Скачиваний:
69
Добавлен:
15.06.2021
Размер:
360.45 Кб
Скачать

Конструкторы в Java

Лекция 4

Допустимые модификации конструкторов:

1.Наследование

2.Перегрузка

3.Переопределение

4.Обращение к конструктору суперкласса (кл. слово super)

//Код суперкласса

//Конструктор класса

public Author(String Name) { this.Name = Name;

}

//Перегрузка — изменение типа и/или числа аргументов public Author(String Name, int Age) {

Author(Name); //Можно вызвать конструктор из конструктора this.Age = Age;

}

//Код класса наследника

//Переопределение — полное совпадение по имени и аргументам public Author(String Name) {

super.Author(Name); //Обязательно при наличии аргументов у конструктора суперкласса this.Age = 0;

}

Использование ключевого слова static

Лекция 4

Допустимое использование:

1.Для полей

2.Для методов

3.Статические блоки (выполняются при первой загрузке класса)

//Код класса

protected static int MinAge; protected static int MaxAge;

static { //Выполнится при первой загрузке класса (!не объекта) MinAge = 0;

MaxAge = 250;

}

//Проверка возраста

public static boolean checkAge(int Age) { if( Age >= MinAge && Age <= MaxAge ) {

return true; } else {

return false;

}

}

Использование ключевого слова final

Лекция 4

Допустимое использование:

1.Запрет переопределения метода

2.Запрет наследования класса

final class Author { //Класс помечен как final. Невозможно создать наследников такого класса //Код класса

protected int MinAge; protected int MaxAge;

Author() { this.MinAge = 0;

this.MaxAge = 250;

}

//Проверка возраста. Метод нельзя будет переопределить.

//Если класс помечен как final, то все методы в нем final и помечать методы словом final не надо public final boolean checkAge(int Age) {

if( Age >= MinAge && Age <= MaxAge ) { return true;

} else {

return false;

}

}

Использование метода finalize()

Лекция 4

Метод finalize() вызывается сборщиком мусора перед освобождением памяти, занимаемой объектом. Сборщик мусора может никогда не вызвать метод finalize, если при выполнении программы не потребовалась очистка памяти. Таким образом, finalize не аналог деструктора в C++

class Author {

//Код класса

//Определяем действия финализатора

protected void finalize() throws Throwable { //тем не менее ошибка наверх не передается

System.out.println("Вызвали финализатор");

super.finalize(); //Финализатор суперкласса, если он был определен надо вызвать в явном виде

}

Внутренние и вложенные классы в Java

Лекция 4

Внутренние классы это не статичесике классы определенные внутри класса Вложенные классы это статические внутренние классы

//Внешний класс class Author {

//Вложенный класс

/* Вложенный класс имеет доступ к членам своего внешнего класса, в том числе и к закрытым членам. Однако,

внешний класс не имеет доступа к членам вложенного класса. Вложенный класс при этом является членом внешнего класса. Из объекта вложенного класса нельзя обращаться к нестатическим членам внешнего класса */

private static class Test { //Код класса

}

}

//Внешний класс

class Author {

int test = 1968;

void Test() {

Inner inner = new Inner(); inner.display();

}

//Внутренний класс /* Внутренний класс может обращаться к любой переменной внешнего класса */

/* Внутренний класс можно определять внутри метода и цикла */ class Inner {

void display() {

System.out.println(this.test);

}

}

}

Динамическая диспетчеризация в Java

Лекция 4

Динамическая диспетчеризация это механизм, на основании которого принимается решение на вызов того или иного переопределенного метода во время выполнения, а не компиляции.

class A // суперкласс А

{

protected int a; A() { }

A(int aa) { a = aa; } void show() {

System.out.println("supperclass a = " + a); }

}

class B extends A // подкласс В

{

protected int b; B() { }

B(int aa, int bb) { super(aa); b = bb; } void show() {

System.out.println("subclass b= " + b); }

}

class C extends B // подкласс C

{

private int c; C() { }

C(int aa, int bb, int cc) { super(aa,bb);

c = cc;

}

void show() {

System.out.println("subclass c= " + c); }

}

class start {

public static void main(String[] args) {

A ob1 = new A(1); B ob2 = new B(2,3);

C ob3 = new C(4,5,6);

A ob; //объявлем переменную типа суперкласса

ob=ob1;

ob.show();

ob=ob2;

ob.show();

ob=ob3;

ob.show();

}

}

//Результаты программы /*

вызывается метод show того класса наследника,

ссылка на который присвоена переменной типа суперкласса */

supperclass a = 1 subclass b= 3 subclass c= 6

Рекомендации по разработке классов

Лекция 4

1.Всегда храните данные в переменных, объявленных как private

Избегайте нарушения инкапсуляции

2.Всегда инициализируйте данные

Явным образом с помощью конструкторов

3.Не используйте в классе слишком много простых типов

Пример — класс Address, хранящий индекс, город, улицу и т. д.

4.Не для всех полей нужно создавать методы доступа и модификации

Пример — список регионов РФ

5.Разбивайте на части слишком крупные классы

Понятие - слишком крупный может быть «логическое» и «физическое». Логическое «слишком крупный» означает, что в классе смешаны данные и методы двух и более логических типов. Например, класс «Author», хранит в себе и книги автора, тогда как логичнее для них создать отдельный класс Book. Физическое «слишком крупный» означает, что в классе слишком много строк кода. Например, опыт компании Диасофт говорит о том, что слишком много это более 2000 строк.

6. Выбирайте для классов осмысленные имена, избегая путающей простоты и двусмысленного толкования

Рекомендации по синтаксису: имя классов и полей — существительное с большой буквы, например, Author. Имена наследников образуются добавлением уточнения перед существительным, например, UzasAuthor. Имена методов начинаются с глагола с маленькой буквы, например, getUzasAuthor().

7. Избегайте количество уровней вложенности классов более 7-8 и количества аргументов методов более 7-8

Ограничение емкости быстрой оперативной памяти мозга («регистров мозга»)

8. Особо не рассчитывайте на метод finalize()

Сделайте все возможное для высвобождения ресурсов кроме finalize()

Соседние файлы в папке Заочники 2020-2021