блябли Flashcards

1
Q

Принципи на ООП

A

Полиморфизъм, Енкапсулация, Наследяванер Абстракция,

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Какво е клас

A

Прототип от който се създават обекти; определя какво състояние могат да имат неговите инстанции, т.е. някакви характеристики които всеки обект от този клас ще има, и поведение, т.е. някакви операции, които могат да се извършват с всеки от обектите

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Какво е обект

A

Обектът е конкретeн представител на един клас, има конкретни характеристики (полета) и конкретно поведение (методи)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Какво са модификаторите за достъп + пример за всеки кога се използва?

A

Начин да определим колко свободно може да се достъпва типа, към който е приложен модификаторът. Има 4 вида модификатори:
- public - може да се достъпва от всякъде; когато знаем че този метод/клас/променлива ще се използва извън класа
- protected - може да се достъпва в пакета в който се намира както и от всички наследници, дори и да са извън пакета
- package-private - това е дефолт модификатора за достъп; може да се достъпва само в рамките на пакета в който се намира
- private - може да се достъпва само в рамките на класа ; например за полета в рамките на един клас

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Статични инициализатори - обясни?
Пример?

A

блок от код без конкретно име или ретърн тип, само със static ключова дума преди него; целта му е да се инициализира статично поле; обикновено се използва когато иницализацията изисква повече от едно действие
Пример - когато трябва да инициализираме лист който вътре да има някакви дефолтни стойности

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Method overloading - обясни?
Ползи?
Пример ?

A

Това е способността в рамките на един клас да имаме повече от един метод с едно и също име, но различни сигнатури (може да прима различен брой и/или различни типове). Известно е още като статичен полиморфизъм, програмата решава кой от двата метода да използва по време на компилация
Ползи - не се налага да създаваме и да помним различни имена за методи които правят едно и също но приемат различен брой или тип параметри.
Пример - метод са сумиране на числа

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Какво е енкапсулация?
Как се постига?
Какви са ползите?

A

“Опаковането” на данните и методите в рамките на едни клас, така че да не може да се достъпват и променят от вън и имплементацията вътре в класа да е скрита за неговите външни потребители.
- Постига се като направим всички полета на един клас private. В случай че логиката на програмата не изисква полетата да може да се променят, правим също всички setter-и private.
- Ползи: пълен контрол и сигурност, че данните вътре в класа са валидни и не биха могли да бъдат “замърсени” по някакъв начин от външни потребители; също така абстракция - външните потребители могат да използват публичните методи на класа като се абстрахират от вътрешната имплементация.

The rule of thumb is simple: make each class or member as inaccessible as
possible. In other words, use the lowest possible access level consistent with the
proper functioning of the software that you are writing.

Information hiding is important for many reasons, most of which stem from
the fact that it decouples the components that comprise a system, allowing them to
be developed, tested, optimized, used, understood, and modified in isolation. This
speeds up system development because components can be developed in parallel.
It eases the burden of maintenance because components can be understood more quickly and debugged or replaced with little fear of harming other components.
While information hiding does not, in and of itself, cause good performance, it
enables effective performance tuning: once a system is complete and profiling has determined which components are causing performance problems, those
components can be optimized without affecting the correctness of others. Information hiding increases software reuse because components that aren’t tightly coupled
often prove useful in other contexts besides the ones for which they were designed.

If a top-level class or interface can be made package-private, it should be.
By making it package-private, you make it part of the implementation rather than
the exported API, and you can modify it, replace it, or eliminate it in a subsequent
release without fear of harming existing clients.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Какво е наследяване?
Защо ни е наследяването – ползи?
Множествено наследяване в джава?

A

Наследяване - възможността един клас да наследява друг клас - т.е. да има същите полета и методи;
Ползи - наследяването е полезно, когато искаме да преизползваме базовите методи и полета на един клас, но да ги разширим в рамките на друг клас. По този начин избягваме повторението на кода който е в базовия клас и в неговия subclass имплементираме само допълнителните функционалности и полета.
В случай че искаме да променим имплементацията на някой от наследените методи можем да го override-нем
Недостатъка е че child класа става тясно свързан и зависим от имплементацията на базовия клас - например ако метод се изтрие от базовия клас, наследниците му ще трябва да бъдат рефакторирани (затова в повечето случаи се предпочита композиция пред наследяване)
Важно: private полетата на един базов клас не са достъпни в неговия child клас освен чрез конкретна негова инстанция!
В джава няма множествено наследяване, освен при интерфейсите.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Какво е полиморфизъм?
Ползи?

A

Полиморфизъм е способността на един обект да приема много форми. Най-често това се проявява когато реферираме чрез базов клас към child клас - например когато третираме story като work item.
Ползи - в зависимост от това дали се обръщаме към един обект като към част от негов parent клас или не можем да използваме различни имплементации на един и същи метод с него (благодарение на method overriding)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Какво е абстракция?
Ползи?

A

Скриването на имплементационните подробности от потребителя, показване само на функционалстотие. По този начин потребителя може да използва функционалстта без да се интересува вътрешно как тя работи.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Method overriding - обясни?
Ползи?

A

Възможността два класа (родител и наследяващ) да имат методи с едно и също име и сигнатура които обаче имат различна имплементация. По този начин наследяващия клас може да има своя имплементация на методи които вече съществуват в класа - родител.
Ползи - за да има по-различна имплементация в наследяващия клас не ни се налага да правим промени в класа - родител; всеки наследяващ клас може да има различна имплементация на този метод; в крайна сметка можем да третираме обектите от наследяващите класове като обекти от класа-родител (т.е. да работим на по-високо ниво на абстракция), като програмата решава кой метод да изпълни по време на изпълнение ( в зависимост от конкретния тип на обекта).

When a parent class reference points to the child class object then the call to the overridden method is determined at
runtime

!!! модификаторите за достъп на override-ващ метод могат да бъдат същите или по-свободни, не и по рестриктивни;
чрез думата super можем да извикаме override-натия метод в класа-родител - по този начин можем да използваме неговата имплементация и да я разширим без да повтаряме код

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Какво е абстрактен клас?
Интерфейс?
Разлика между двете?
кога ползваме абстрактен клас?
кога ползваме интерфейс?

A
  • Абстрактен клас е начин да постигнем абстракция (т.е. да скрием имплементационните подробности и да предоставим само функционалността на потребителя). Това е клас който не може да се инстанцира. Задължително трябва да се наследява и има свои полета и методи които се наследяват от неговите наследници. В рамките на абстрактния клас създаваме абстрактни методи (имат единствено сигнатура, но не и имплементация), които е задължително да бъдат override-нати в наследавящите класове, за да получат конкретна имплементация. Абстрактните методи реално са общо поведение, което всеки от наследяващите класове е длъжен да има.
  • Интерфейс - друг начин да постигнем абстракция. Няма полета, съдържа само абстрактни методи които по default са публични, може да има също статични методи и променливи. Може да има default методи с имплементация, но не е желателно. Един интерфейс може да наследява много други интерфейси. Когато един клас имплементира интерфейс, е длъжен да override-не всичките му абстрактни методи или той самият да бъде абстрактен. Един клас може да имплементира много интерфейси. Идеята на интерфейса е да съдържа общото поведение на група от класове, които го имплементират. По този начин си осигуряваме по-добра абстракция когато работим на ниво интерфейс (и се възползваме от полиморфизъм)
  • Прилики: позволяват дефинирането на общо поведение чрез абстрактни методи; позволяват програмиране на по-високо ниво на абстракция и полиморфизъм
  • Разлики: абстрактния клас все пак има състояние и може да има базови методи с имплементация които да не са абстрактни
  • ползваме абстрактен клас когато: има ясно изразена йерархия, искаме да има вътре някакво състояние, искаме да смесим абстрактно поведение с конкретна имплементация
  • използаме интерфейс когато: искаме да определим общо поведение за група от класове; искаме да дефинираме някакви допълнителни способности, които някои класове ще имат, но други класове няма да имат; имаме нужда от множествено наследяване
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Как постигаме силна кохезия и loose coupling?

A
  • Кохезия - колко силно свързани помежду си са елементите в един модул (клас/метод/пакет); кохезията трябва да е силна, за да можем по-лесно да се справяме със сложността на програмата и да я поддържаме и разширяваме по лесно
  • как се постига: да имаме добре дефинирани абстракции; класовете да имат силно свързани помежду си функционалности които имат едно предназначение; трябва да има малко полета и всеки следващ метод в рамките на класа да използва все повече полета; слабата кохезия си личи когато един клас може да бъде разделен на два или повече
  • къплинг - степента на която всеки модул зависи от други модули; къплинга трябва да е рехав, за да можем по лесно да поддържаме програмата и да я разширяваме;
  • как? - всички класове трябва да имат малки, директни и видими връзки към другите класове (за да може когато правим една промяна тя да се отразва само на един клас а не на много класове); един модул трябва лесно да може да се използва от други модули; трява да се програмира на ниво интерфейс
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Какво е композиция?

A

Използване на един обект като поле в друг клас (has-a връзка). Винаги е за предпочитане пред наследяване ако логиката го позволява, защото по този начин имаме loose coupling.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Какво е финален клас?

A

Клас който не може да се наследява. Правим такива класове например ако създаваме библиотека и не искаме нейните потребители да могат да променят имплементацията.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

За какво използваме new?

A

За да инстанцираме класове - с new отделяме памет за новия обект и връщаме неговата референция към тази памет

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

За какво използваме this

A

само с this викаме конструктор от същия клас, за да го overload-нем; в този случай this трябва да е първия ред в конструктора
с this.поле викаме сегашната инстанция на някое поле; използва се в случаите когато има конфликт между имената на параметрите на един метод и имената на променливите които се ползват в него

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

За какво използваме super

A

Super: използва се в наследяващ клас и сочи към базовия клас; използва се за да викаме методи от базовия клас или също в случаите когато викаме конструктора на базовия клас в конструктора на наследяващ клас

19
Q

По стойност ли се подават данните в джава или по референция

A

Накратко, в Java данните се подават по стойност. При примитивни типове се подава стойността на аргумента. Тази стойност се копира в параметъра на метода. Ако правим промени на стойността на параметъра, това не се отразява на стойността на аргумента, тъй като стойността на параметъра е копие на стойността на аргумента, а не самата стойност. Всякакви промени в стойността на параметъра съществуват единствено в рамките на метода, освен ако метода не връща данни като резултат(тогава тези данни могат да се запазят в нова променлива). При референтните типове се подава стойността на референцията на аргумента. Тази стойност се копира в референцията на параметъра на метода. Ако правим промени на състоянитео на параметъра, тъй като той има същата референция каквато има и аргумента, двете всъщност работят с един и същи обект и състоянието на обекта към който сочи се променя НО самият обект няма да се промени – той ще бъде абсолютно същия, просто с различно състояние. Ако обаче в рамките на метода променяме стойността на референцията на параметъра, това няма да се отрази на референцията на аргумента; двете вече ще сочат към различни обекти.

20
Q

Разлика между == и equals?

A

== е оператор който при примитивен тип данни сравнява стойностите им, а при референтен тип данни сравнява референциите им.
Equals е метод който може да сравнява самите стойности на данните (като тези данни трябва да са от референтен тип). Например ако подадем стринг ще сравни самия текст вътре в стринга дали е равен на другия текст. Ако използваме equals с обект без да сме го Override-нали, той ще работи като ==, т.е. ще сравни референцията (адреса).

21
Q

разлика между статични и финални променливи

A

Static променливите са независими от конкретна инстанция на класа и се отнасят генерално към класа; инициализират се веднъж в началото на изпълнение на програмата (преди инстанциране и инициализиране на всички останали променливи). Final променливите реално са константи – веднъж инициализирани не могат да се променят.
за финална променлива която е от референтен тип - If the variable is a reference, this means that the variable cannot be re-bound to reference another object. But the object that it references is still mutable, if it was originally mutable.

22
Q

Как се държи final думата когато се приложи към клас, поле, променлива, метод

A

към клас: означава че класът не може да се наследява - обикновено такива класове се правят когато някой изработва библиотека и не иска поведението на класовете в нея да може да се променя чрез наследяване към метод: означава, че методът не може да бъде override-нат - прави се например ако в базовия клас този метод съдържа някаква много ключова фукционалност, която не трябва да се променя към поле: означава че след като веднъж се зададе първоначалната стойност на това поле, тя вече не може да се променя (на практика е константа) към локална променлива: final я прави константа, т.е. не може да се променя след като й се зададе първоначална стойност

23
Q

Разлика между local static и instance проенливи

A

Local – променлива съществуваща единствено в рамките на конкретен метод или блок от код Static – променлива съществуваща в/принадлежаща на класа и не отнасяща се към конкретна негова инстанция. Инициализира се само веднъж в началото на изпълнението на програмата. Instance –променлива, отнасяща се към конкретен обект, която съхранява някакво негово състояние

24
Q

Разлика между примитивен и референтен тип

A

Примитивните типове съдържат стойността си. винаги имат стойност; ако копирам променлива от примитивен тип и променя копието, това няма да се отрази на оригинала
Референтните съдържат указания за адреса, където е запазена стойността им в heap паметта; може да са Null; ако копирам промелнива от референтен тип и променя копието, това ще се отрази на оригинала, защото двете променливи сочат към едно и също място в heap-а

25
Q

autoboxing and unboxing?

A

автоматичното превръщане на примитиевн тип в пеферентен или обратното

26
Q

какво е стринг пуул-а?

A

специална част от хийп паметта, където Java пази String-овете. Целта е да оптимизира използването на памет. Идеята е че всеки String в този pool има само едно копие. Т.е. ако напарвим две променливи от тип String които имат една и съща стойност, реално те ще имат една и съща референция която сочи към едно и също място в String pool-а. Тоест не се отделя допълнителна нова памет за String-ове с една и съща стойност - те просто се пазят на едно и също място. Всичко това важи ако String-ът е създаден като String literal (а не като обект с оператора new)

27
Q

ползи от това че стринга не може да се променя?

A

оптимизира се използването на памет (заради String pool-а); има също някакви плюсове от гледна точка паралелно програмиране, които не разбирам

28
Q

разлика между стринг, стринг билдър и буфер?

A

основната разлика е че String не може да се променя, докато StringBuilder и StringBuffer могат: когато правим някакви промени по един String (например конкатениране) това което реално се случва е че се създава нов обект String, който вече е конкатенираната версия, а стария не се използва повече. Когато обаче правим промени по StringBuilder/Buffer, тъй като те са обекти които могат да се променят, промяната става директно върху вече създадения обект и не се налага да се прави нов. Това означава че работата със StringBuilder/Buffer е доста по-бърза (и затова се препоръчва едно от двете да се използва когато трбява да правим промени на String в цикъл). Разликата между StringBuildet и StringBuffer e че StringBuffer е по-стар клас и е по-подходящ при паралелно програмиране. За линейно програмиране е най-добре да се използва StringBuilder защото е по-бърз.

29
Q

какво е имютабъл и как се прави

A

означава, че стойността не може да се промени след като е веднъж зададена; правим immutable променливи когато ги направим final; правим immutable клас когато го направим финал за да не може да се онаследява и всички сетъри са private а всички полета са private и final

30
Q

каква е разликата между хийп и стак памет

A

стак - статична памет, в нея се пазят локалните променливи в поредността на тяхното извикване, по-малка е и съответно по-бърза;
хийп - динамична памет, в нея се пазят полетата и референтните типове данни, по-голяма е и по-бавна, има garbage collector който трие променливите които вече не се използват от хийп паметта

31
Q

Какво е джава

A

език за програмиране, който е:
1. независим от платформата (wora)
2. позволява мултитрединг
3. бърз
4. прост и сигурен (автоматично управление на паметта)
5. има полезни вградени библиотеки (java api)
6. може да се използва за всякакви приложения
7. обектно-ориентиран
създаден е с идеята да е платформено независим, да използва по-малко памет, да поддържа многонишково програмиране, да е сигурен

32
Q

како е машинен език

A

инструкции директно към процесора в двоичен код - изпълнява се много бързо, защото не се налага да се превежда, но е много труден за разбиране от хора и е зависим от хардуера (самия процесор)

33
Q

какво са езиците на ниско ниво

A

това обикновено са асемблерните езици - имат много ниско или никакво ниво на абстракция между езика и машинния език; считат се трудни за използване от хора (защото не се доближават много до човешки език); лесно се обръща в машинен код

34
Q

какво са езиците на високо ниво

A

те крият детайлите на ниско ниво и са по близки до човешкия език; независими са от хардуера; обръщат се в машинен език чрез компилатор или интерпретатор
примери - джава, с , с++ итн

35
Q

какво е компилатора и как работи

A

минава през целия код и го превръща в машинен код, като проверява синтаксиса и семантиката на кода който е написан на език на високо ниво; оптимизира кода; всяка промяна в кода изисква нова компилация, защото компилациятя се извръшва преди изпълнението на програмата и двата процеса не са свързани; генерира код на по ниско ниво (невинаги машинен); зависи от хардуера (процесора);
кодът се изпълнява по-бързо защото компилацията се случва преди изпълнението и изпълнението е на код който вече е на по-ниско ниво (и не трябва тепърва да се интерпретира);
хваща грешки преди изпълнение

36
Q

какво е интерпретатора

A

той започва да чете кода от началото, като чете statement по statement, има предварително подготвен машинен код за него, търси този готов машинен код, намира го и го изпълнява - това отнема време, затова изпълнението на програмата е по бавно отколкото ако работим с компилатор; зависим е от хардуера; работи по време на изпълнение - затова винаги отразява промените в кода; по този начин самата програма е независима от хардуера;
грешките се проявяват едниствено при изпълнение

37
Q

как се изпълняват джава програмите

A
  1. пишем си сорс кода
  2. компилираме - сорс кода ни се обръща в джава байткод
  3. джава байткода се интерпретира от джава виртуалната машина - тя се държи като нормална физическа машина, която обаче приема инструкции под формата на джава байткод и ни гарантира платформена независимост; виртуалната машина извършва управлението на паметта; има различни виртуални машини спрямо хардуера и операционната система
38
Q

какво се случва във виртуалната машина на джава

A
  1. има клас лоудър който зарежда .class файловете;
  2. Just in time(JIT) compiler-а компилира байткода в машинен код по време на изпълнение на програмата, като когато срещне повторения на кода ги запазва компилирани в кеш паметта и ги достъпва по-лесно и бързо
  3. Garbage collector-а трие обектите и променливите които вече не се използват от стак паметта
  4. security manager-а управлява използването на памет?
39
Q

разлика между jdk и jre

A

jdk съдържа всички инструменти за разработване на джава код; jre е само runtime environment - съдържа всичко необходимо за да изпълняваме програми написани на джава (т.е. виртуалната машина и java api)

40
Q

какво е bytecode

A

това е кодът на който се превеждат инструкциите за виртуалната машина на джава; благодарение на него джава е платормено независим език. байткодът не е машинен код, защото не може да бъде изпълнен от процесора - за да може да бъде изпълнен първо трябва да се преведе от интерпретатор

41
Q

какво е generic

A

конретно в джава - клас, интерфейс или метод който може да се излозва с много типове (но трябва да са референтни); уточняваме типа с <>; дали типовете се използват правилно се проверява от компилатора когато компилира програмата;
пример - List<> интерфейса, ArrayList<> класа;
плюсове - можем да преизползваме код
bounded generic - с него може да ограничим типовете които може да се ползват само до тези които наследяват определен клас
wildcard - има upperbound
extends T> says that the type is one that extends T, i.e. Integer and Number
и lowerbound
super T> says that the type is one that is inherited by T, i.e. Number and Integer

42
Q

pass by value vs pass by reference

A

при подаването по стойност всъщонст подаваме на метода копие на променливата. стойността на оригиналната променлива не с променя. плюсовете на това е че това, което правиш в рамките на метода няма странични ефекти извън него; минусите са че ако искаш метода да има ефект извън себе си трябва да използваш return, а той може да е само един (т.е. не можеш да върнеш две или повече неща); още един минус е че използваш повече памет (защото правенето на копия предполага заемане на още място в паметта)
при подаването по референция подаваш на метода референция, сочеща към оригиналната променлива; това означава че всичко което правиш в рамките на метода се отразява на променливите извън него; плюсовете са че пестиш памет защото не правиш копия и освен това ако това ти е целта, можеш да променяш много неща извън метода (т.е. все едно можеш да върнеш не само едно нещо, а много)
Java e pass by value винаги, като в случая на обектите това value е всъщност референция (защото променливите в кода ни пазят само референции, самите обекти се намират в heap-a); т.е. ако подадеш обект на метод, промяната в полетата на обекта в рамките на метода се отразява и извън него, но ако се опиташ да подмениш самия обект това няма да се отрази, защото не можеш да подмениш референцията (ти имаш само нейно копие)

43
Q

Main method

A

main method is static since it must be be accessible for an application to run before any instantiation takes place.