Elméleti Beugró Kérdések és Válaszok

Programozás 1 - Milton Friedman Egyetem (Csolti Péter)

I. Ismétlés: metódusok

1) Eljárás vagy függvény? (void, return)
Az eljárás (void) nem ad vissza értéket, csak végrehajt egy feladatot. A függvény (visszatérési típussal rendelkező metódus) a return kulcsszóval értéket ad vissza a hívónak.
2) Mi határozza meg a függvény típusát? (mi a kapcsolat a return-nel)
A függvény típusát a visszatérési érték típusa határozza meg. A return után álló kifejezés típusának meg kell egyeznie a metódus fejlécében deklarált típussal.
3) A static metódusok mit érnek el?
Az osztályhoz tartoznak, nem egy konkrét példányhoz. Példányosítás nélkül, az osztály nevével hívhatók (pl. Math.Sqrt()). Csak statikus tagokat érhetnek el közvetlenül.
4) Formális és aktuális paraméterek közötti különbség?
A formális paraméterek a metódus deklarációjában szereplő változónevek. Az aktuális paraméterek (argumentumok) azok a konkrét értékek, amelyeket a hívás pillanatában átadunk.
5) Mi tartozik a metódus szignatúrájába?
A metódus neve és a paraméterlistája (paraméterek száma, típusa és sorrendje). A visszatérési érték típusa és a láthatósági módosítók nem részei a szignatúrának.
6) Mi jellemző a túlterhelésre (overloading)?
Azonos metódusnév, de eltérő paraméterlista (eltérő szignatúra) ugyanazon az osztályon belül.
7) Mi jellemző a konstruktor függvényre? (egy „hagyományos” függvényhez képest)
Nincs visszatérési típusa (még void sem), neve pontosan megegyezik az osztály nevével, és az objektum példányosításakor (a new operátorral) fut le.
8) Osztály, objektum, példány, operátor, konstruktor a Random rnd = new Random() sorban
  • Random: Osztály (típus).
  • rnd: Referencia változó.
  • new: Példányosító operátor.
  • Random(): Konstruktor hívás.
  • Az eredmény: egy létrejött objektum vagy példány a memóriában.
9) A main() -ből mit tudunk hívni?
Mivel a main statikus, közvetlenül csak más statikus metódusokat hívhat meg. Példány-metódusokat csak az adott osztály példányosítása után, az objektum-referencián keresztül érhetünk el.
10) Mire jó az enum felsoroló típus? Van köze a metódusokhoz?
Fix, véges értékkészlet definiálására szolgál. Lehetnek saját metódusai (pl. Java-ban), és gyakran használják metódusok paramétereként a típusbiztonság növelése érdekében.
11) Mit tudunk egy metódus mellékhatásáról?
Mellékhatásnak nevezzük, ha a metódus a visszatérési értéken kívül módosítja a program állapotát (pl. osztálymező módosítása, konzolra írás, fájlmentés).
12) Mi jellemző egy metódusra (Clean Code elvek), eljárás vagy függvény legyen ami számol?
A Clean Code szerint egy metódus egy dolgot csináljon. Ami számol, az legyen függvény (adja vissza az eredményt), és ne legyen mellékhatása (pl. ne írjon ki semmit közben).

II. OOP paradigma

1) Melyek az OOP alapelvei?
Egységbezárás (Encapsulation), Öröklődés (Inheritance), Polimorfizmus (Polymorphism) és Absztrakció (Abstraction).
2) Override és overload különbségek metódus szintjén, öröklődés során?
Az overload (túlterhelés) azonos osztályon belüli, más paraméterezésű metódusokat jelent. Az override (felülírás) öröklődésnél történik: az utódosztály újraírja az ős metódusát pontosan ugyanazzal a szignatúrával.
3) Mi jellemző az öröklésre?
Az utódosztály (subclass) megörökli az ősosztály (superclass) látható tulajdonságait és viselkedését, lehetővé téve a kód újrafelhasználását és a hierarchikus felépítést.
4) Melyik nem objektumorientált lehetőség (static, túlterhelés, felülírás)?
Mindhárom használatos, de a static a legkevésbé "objektumorientált", mivel az osztályszintű működést támogatja a példányosítás helyett. Ha választani kell az OOP alapkövei közül, a static nem tartozik az alapelvek közé.
5) Melyik kulcsszó utal az egységbezárásra?
A láthatósági módosítók: private, protected, public.
6) Ha az osztályok léteznek és van köztük öröklés, akkor melyik helyes (polimorfizmus ős és utód kapcsolatban)?
Egy ős típusú referencia mutathat egy utód típusú objektumra.
7) Melyik a pontos megfelelője x-nek: Object x; (referencia, objektum, példány, osztály)?
Referencia. Ez egy változó, ami képes egy objektum címét tárolni, de maga az objektum még nem jött létre.
8) Mi nem jellemző a konstruktorra?
Nem jellemző rá, hogy lenne visszatérési típusa, vagy hogy manuálisan hívható lenne egy már létező objektumon.
9) Elképzelhető, hogy egy osztálynak nincs konstruktora?
Nem. Ha a programozó nem ír egyet sem, a fordító automatikusan generál egy alapértelmezett, paraméter nélküli konstruktort.
10) Melyek az GIT technológia szolgáltatásai?
Verziókezelés, változások követése, elágazások kezelése (branching), összefésülés (merging), távoli tárolás és közös munka támogatása.
11) Mi az utasítás balról jobbra olvasott értelmezése: Random r = new Random()
Random (típus deklaráció) -> r (referencia változó neve) -> = (értékadás/hozzárendelés) -> new (objektum létrehozása a heap-en) -> Random() (konstruktor hívása az inicializáláshoz).
12) Mi a kapcsolat a Git és az IDE között?
Az IDE (fejlesztőkörnyezet) integrált felületet biztosít a Git parancsok használatához (pl. gombok commit-hoz, push-hoz), így nem kell mindenhez terminált használni.

III. OOP konstruktor

1. Mi a dolga a konstruktornak?
Az objektum példányosításakor a kezdőállapot beállítása (mezők inicializálása) és az esetleges erőforrások lefoglalása.
2. Milyen lehetőségeink vannak egy adatot (field) beállítani?
Közvetlenül a deklaráció helyén, a konstruktorban, vagy később setter metódusokon (C#-ban property-ken) keresztül.
3. Melyek az OOP modell osztály elkészítésének elvei?
Az adatok elrejtése (private field-ek), hozzáférés biztosítása kontrollált módon (getter/setter), és az adatok validálása a beállításkor.
4. Hogyan hat az objektumra a konstruktor?
Pontosan egyszer fut le az objektum élete során, a létrehozás pillanatában. Biztosítja, hogy az objektum konzisztens állapotban jöjjön létre.
5. Objektum állapotának beállítása hogyan lehetséges általunk írt setter nélkül?
Konstruktoron keresztül a létrehozáskor, vagy publikus mezők esetén közvetlen módosítással (utóbbi nem ajánlott).
6. Mit nem célszerű elhelyezni modell osztályban?
Bonyolult üzleti logikát, felhasználói felületet kezelő kódot (UI), vagy közvetlen adatbázis-elérést. A modell az adatok reprezentációjára szolgál.
7. Mi a dolga egy setternek?
Értéket ad egy privát mezőnek, és lehetőséget biztosít az adat ellenőrzésére (validálására) a beállítás előtt.
8. Adj meg gettert az int kor adattagra!
Java: public int getKor() { return kor; }
C#: public int Kor { get => kor; }
9. Változók inicializálása milyen sorrendben fut le?
1. Statikus tagok, 2. Példányszintű alapértékek (deklaráció helyén), 3. Konstruktor törzse.
10. Mi a helyes módszer az adatok ellenőrzésére, a kódduplikálás elkerülésével?
A validációs logikát a setterekbe kell tenni, és a konstruktorból भी ezeket a settereket kell meghívni közvetlen mező-értékadás helyett.

IV. OOP konstruktorhívási lánc, override

1. Hogy hívják azt, amikor egy konstruktorból egy másikat hívunk?
Konstruktor láncolás (Constructor Chaining).
2. Miért fontos a konstruktorhívási lánc?
Segít elkerülni a kódismétlést: a közös inicializáló logika egyetlen konstruktorban összpontosul, a többi csak továbbpasszolja az adatokat.
3. Hány konstruktora van / lehet egy saját osztálynak?
Bármennyi lehet, amennyiben a paraméterlistájuk (szignatúrájuk) különbözik (Constructor Overloading).
4. A default-tal együtt hány konstruktort írhatunk, ha minden esetet le akarunk fedni, az int a, b; adattagokra?
4 esetet: (), (int a), (int b), (int a, int b).
5. A default konstruktorból hogy hívjuk meg a Hajo(int a) konstruktort, ha 1 az alapérték?
Java: this(1);
C#: public Hajo() : this(1) { }
6. Ha hibás egy érték annak beállításakor, mi az elvárt működés?
A programnak hibát (kivételt/Exception) kell dobnia, jelezve, hogy az objektum érvénytelen állapotba kerülne.
7. A class Hajo { kezdetű saját osztály örököl e bármit?
Igen, alapértelmezésben minden osztály az Object osztályból származik le, így örökli annak metódusait (pl. toString, equals).
8. Hogyan írható felül egy örökölt metódus?
Az utódosztályban azonos szignatúrával deklaráljuk a metódust. Java-ban az @Override annotációval, C#-ban az override kulcsszóval jelöljük (ha az ősmetódus virtual vagy abstract).
9. Mi a toString szerepe?
Az objektum aktuális állapotát (mezőit) reprezentáló szöveges formátum előállítása, ami leginkább debugolásnál hasznos.
10. Mi a kapcsolat az equals() és a hashCode() között?
A szerződés szerint: ha két objektum egyenlő (equals), akkor a hash kódjuknak is azonosnak kell lennie. Megfordítva nem feltétlenül igaz (hash ütközés).
11. Rendezd sorba a helyes működés lépéseit egy hash alapú kollekcióban!
1. hashCode() hívása az objektum indexének meghatározásához.
2. A megfelelő tárolóhely (bucket) megkeresése.
3. Ha a helyen már vannak elemek, az equals() hívása a pontos egyezés megtalálásához.