Java Virtual Machine (или JVM) е абстрактна изчислителна машина, която е основният компонент, осигуряващ независимостта от хардуер и операционна система. Тя конвертира байт кода до машинен код.
Компоненти на Java програма
1. package/namespace: логическата организация на файловете
2. клас = базов компонент: данни + поведение
3. обект - променлива от тип клас
4. променлива = контейнер за стойност; има тип,име, стойност
5. методи: return || void; решават конкретен проблем
6. изрази - могат да съдържат литерали, променливи, символни константи и операции; могат да извикват методи
Какво е конструктор?
специален вид return метод, който се извиква при създаване на обект; конструкторите са полиморфни и overload-нати
Какво е композиция?
Ползване на обекти от един клас като атрибути в друг клас
Модификатори в Java
a) access modifiers: public, private, protected, default (кодът е достъпен само в съответния пакет)
b) non-access: final (cannot be overridden), static(принадлежи на конкретен клас, а не обект), abstract
Как трябва да се казва класът с модификатор на достъп public?
Както се казва файлът
Възможно ли е в един java файл да опишем повече от един клас?
Да, но само един от тях е с модификатор за достъп public и носи името на файла.
Възможно ли е в един клас да опишем друг клас?
Да
Къде е видима една променлива?
В секцията където е декларирана
Кой от двата файла се създава първи - .java или .class?
.java където е кодът, след това се създава .class където е байт кодът
Какъв ще е резултатът от следния код?
int a = 5,b = 10, c = 15, d = 20;
if (a++ > 3 || b++ > 5){
c++;
}else {
c--;
}System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d++);
System.out.println(+(++d));
6, 10, 16, 20, 22
Предназначение на условните оператори
В зависимост от зададеното условие се извършва действие, т.е. те придават динамика на програмата чрез логически разклонения
- оператори с предусловие: if-else (позволява един оператор без тяло), switch-case(м-во алтернативи; default = else; в case влиза само един аргумент! Използва се при String и int),while, for, foreach = for(Type t : list) [работи с референции]
- оператори със следусловие: do-while
- краен и безкраен цикъл
Continue vs. break
- break: напускане на цикъла без изпълнение на останалите конструкции
- Continue: спира изпълнението на текущата итерация; връща се в началото; изпълнява нова итерация
Кога се използва оператор for?
Когато знаем необходимия брой итерации.
Кога се използва оператор while?
Когато не знаем необходимия брой итерации.
Кога е удачно да използваме цикъл със следусловие?
Когато искаме да гарантираме, че поредицата от операции ще бъде изпълнена най-малко веднъж.
Оператори
аритметични оператори, релационни (==,!=,<=, >=, <,>), логически (&&,||), побитови, за присвояване, тернарен оператор, new, instanceof, cast (produces a value of the given type by converting the value of the original expression to the new type)
Масиви
съвкупност от стойности от един и същ тип
- представители на класовете: работят по референции
- имат фиксирана дължина след инициализация
- елементите са индексирани /[0;n-1]/
- линейна последователност!
- поддържат сортировка
- НЕ МОЖЕМ да вмъкваме и изтриваме елементи
Какво е сортировка?
Процесът на подреждане на елементите на дадена колекция в определен ред (напр. възходящ или низходящ). Такива алгоритми са Selection Sort (търсим най-малкия елемент и го разменяме с първия и така докато не го подредим) и
Bubble Sort (претърсваме масива и разменяме съседните елементи, които не са в правилната последователност).
Как се сортират колекции в Java?
В Java има няколко начина за сортиране на колекции. Един от най-честите начини е използването на методаCollections.sort()за списъци или методаArrays.sort()за масиви. Друг вариант е чрез използване на методи от интерфейситеComparable- int compare(obj) /ако имаме достъп до сорс кода/ иComparator- int compareTo(obj1,obj2) /подходящ за м-во критерии/. Съществуват иалгоритми за сортиране(Selection sort, Bubble sort).
Selection Sort
Търсим най-малкия елемент и го разменяме с първия елемент...
int helper;
for (int i = 0; i < arr.length; i++) {
for (int j = i; j < arr.length; j++){
if (arr[i] < arr[j]){
helper = arr[i];
arr[i] = arr[j];
arr[j] = helper;
}
}
System.out.print(arr[i] + " ");
}
Bubble Sort
Претърсваме масива и разменяме съседните елементи, които не са в правилната последователност.
- Резултат: най-големият елемент e вдясно.
boolean flag = true;
while (flag){
flag = false;
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i+1]){
helper = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = helper;
flag = true;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
Динамични масиви
нямат фиксирана дължина; garbage collector (Автоматично освобождаване на вече ненужната памет посредством Java-run-time-system)
- ArrayList<>() list = new ArrayList<>(); //заделената памет зависи от версията на езика
- HashMap //удобни за построяване на двоични дървета
Възможно ли е императивно програмиране на езика Java?
Да
Рекурсия
Когато в тялото на метод се извършва обръщение към същия метод, казваме, че методът е пряко рекурсивен.
Ако метод A се обръща към метод B, B към C, а С отново към А, казваме, че методът А, както и методите В и C са непряко (косвено) рекурсивни или взаимно-рекурсивни.
Веригата от извиквания при косвената рекурсия може да съдържа множество методи, както и разклонения, т.е. при наличие на едно условие се извиква един метод, а при различно условие се извиква друг.
Определение за клас
множество от обекти със сходни характеристики на поведение и състояние. Съдържа атрибути и методи. Асоциираме го с потребителски тип данни.
Какво наричаме конструктор по подразбиране?
такъв без параметри. Няма параметри защото не знаем какви ще ни потрябват
Можем ли да имаме повече от един конструктор в класа?
да, но трябва да се различават по брой и/или вид параметри
Ключова дума this
неявно се подава като параметър на всеки конструктор и нестатичен метод на класа; достъпване на член-променливи; извикване от конструктор на друг overloaded конструктор в същия клас; извикване на произволен метод на класа
Къде е грешката в кода?
public Person(String name, int age) { name = name; age = age; }
Все едно присвояваме променливата в скобите на конструктора на самата себе си. Трябва да ги достъпим с ключова дума this.
Output: null 0
instanceof
Използва се за type checking на референтните типове - дали даден обект е инстанция на даден клас
Какво е статично поле?
- еднакво е за всички представители на класа. За него последната промяна се зачита.
- Можем да го достъпим директно с името на класа, а не чрез негова инстанция.
Каква е разликата между статични и нестатични методи?
статичните методи имат достъп само до статични член-променливи и други статични методи, но нестатичните имат достъп до всички полета и методи
Къде е грешката в кода, ако приемем, че викаме метод със същото име, но от родителския клас?
Така написано изглежда, че извикваме същия метод рекурсивно. Ще ни изкара StackOverflowError. Правилно е да се обърнем към метода като укажем класа, напр. student.printInfo();.
Можем ли на родителски клас да присвоим неговия подклас?
Да
Имаме класовете А,Б,Ц, които се наследяват /A <- B <- C/. Решаваме, че ще създадем нов обект D = new C(); В какъв ред ще се изпълнят конструкторите?
Изпълнението на констукторите започва от най-старшия родителски клас, т.е от А.
Какво е характерно за Object в JAVA?
Той е родителският клас на всички класове, могат да му се присвояват всякакви данни.
Пакети в Java
именувани групи от семантично свързани класове -> йерархична организация на кода; вграждат се с ключова дума import
Сравнение по критерии чрез функционални интерфейси