1. Milles seisneb static typing ja dynamic typing erinevus?
Static-
Muutuja tüüpi on teada kompileerimise ajal ning seda muuta ei saa. See vähendab vigade hulka
programmi töö ajal.
Dynamic – Muutuja tüüp
selgub programmi töö ajal.
2. Milliseid piiranguid seavad nähtavusele proteced ja package -private (default) nähtavused?
Public – nähtav kõigile
Package private- nähtav
paketi sees
Private – nähtav klassi sees
Protected – nähtav paketi sees ja alamklassidele
3. Mis on Oracle Java virtuaalmasina (JVM) nimi? Kes ei tea, kukub ainest läbi :)
JRE Java Runtime Environment – java programmi käivitamiseks
JDK – Java Development Kit - arendusvahend java programmi
arendamiseks 4. Tüübiteisendus - milleks vajalik, kuidas kasutatakse?
Fruit a = new
Apple (); Alamtüüp.
Deklareeritud tüüp -- Loodud tüüp.Millist tüüpi deklareerida? - Eelistada alati üldisemat tüüpi
Alamtüüpi objekti same alati kasutada ülemtüübina(implicit
casting ). Apple b = new Apple(); Fruit c =b;
Vastupidine tegevus nõuab selget teisendust(explicit casting)
Allateisendus: Muudate objekti tüüpi kui teil on teada, et mingi (laiemat) tüüpi objekt on tegelikult
kitsamat tüüpi. Fruit a = new Apple(); JVM loob objekti ja unustab ,et see loodi Apple´st
Deklareerime, et a on Fruit tüüpi.
Kui
soovime a-d uuesti Apple-na kasutada, peame tegema allateisenduse: Apple d = (Apple) a;
5. Olgu antud suvaline objekt. Millist tüüpi see teoreetiliselt võib olla?
Liides , Klass, Alamklass,
Object (iga klassi ülemklass)
6. Milline on konstruktorite käivitusahel? Nt võib töösse tulla koodinäide ja teie ülesandeks on
selgitada konstruktorite käivitamise järjekorda .
Meetod, mis käivitatakse automaatselt uue objekti loomisel.
Tagastab viite loodud
objektile .
Kasutatakse objekti algväärtustamiseks.
Kõik objektid pärivad vaikimisi Object klassilt. Kui teie klassis puudub konstruktor,
luuakse vaikimisi
argumendita konstruktor.
Uut objekti
luues kutsutatakse alati välja
ülemklassi argumendita konstruktor
enne kui täidetakse käsud
selle klassi konstruktoris.
Kui
kirjutate ainult argumendiga konstruktor, siis kompilaator argumendita verisooni automaatselt ei
lisa.
Mis juhtub, kui alamklassis on argumendiga konstruktor, aga ülemklassis konstruktor puudub?
Kompilaator lisab ülemklassile argumendita konstruktori, alamklassist luues käivitatakse see enne
alamklassi konstruktorit.
Mis juhtub, kui alamklassis on argumendiga konstruktor, ja ülemklassis samuti ainult argumendiga
konstruktor? Programm ei kompileeru, sest pole võimalik käivitada ülemklassi konstruktorit.
Käivitusahel: Alamklass extends Ülemklass2, Ülemklass2 extends Ülemklass1.
1.Ülemklass1 konstruktor, 2.Ülemklass2 kontruktor, Alamklass konstruktor
Alamklassi konstruktori käivitades on ülemlassi väljad argväärtustatud. St alamklassi konstruktoris
saame kasutada ülemklassi
välju ja
meetodeid .
7. Kui ülemklassis on ainult argumendita konstruktor, aga alamklassis argumendiga konstruktor, kas
see kood kompileerub? Miks? (Kõige lihtsam: proovige järgi!)
Jah, sest kutsutakse esialgu välja ülemklassi argumendita konstruktor, mis meil olemas, ja seejärgi
alamklassi konstruktor.
8. Kui alamklassis on ainult argumendita konstruktor, aga ülemklassis argumendiga konstruktor, kas
see kood kompileerub? Miks?
Ei, sest kutsutakse välja ülemklassi argumendita konstruktor, mida meil ei ole ning kompilaator ei lisa
automaatselt argumendita konstruktori.
9. Uurige, milliste käskudega toimib konstruktorite omavaheline ja ülemklassi konstruktori
väljakutse .
This(); Argumendiga konstruktor kutsub ülejäänud väljade väärtustamiseks argumendita konstruktorit.
See väljakutse peab olema enne ülejäänud koodi, ehk 1.
real .
Super(); on ülemklassi konstruktori väljakutse. Super võtmesõnaga saame kasutada ülemklassi
(ülekirjutatud) võimalusi, sh ülemklassi konstruktorit, välju ja meetodeid.
10. Mis vahe on viidal ja objektil?
Viide ainult viidab mälukohale, kus asub see objekt.
Viit objektile endale - this Enamasti ei ole tarvis kasutada,
piisab meetodi või välja nimest:
doSomething();
Kasutatakse nimekonfliktide vältimiseks ja konstruktorites - sh this()
11. Mis vahe on klassil ja objektil?
Klass = tüüp, definitsioon (programmikood). Olemas ka siis kui programm parasjagu ei tööta.
Objekt =
klassist tehtud konkreetne eksemplar programmi töö ajal (new Type..)
12. Kirjutage üks polümorfse koodi näide ( polümorfism == pärimisest tulenev polümorfism). Testis
peate hindama , kas mingi kood on polümorfne või mitte.
Üldiselt kolme tüüpi polümorfismi:
Ülelaadimisest tulenev (ühe nimega meetod, erinevad väljakutsed .
Geneeriline polümorfism (geneeriliste tüüpide abil)
Pärimisest tulenev polümorfism (subtyping)
Objektorienteeritud programmeerimises peame polümorfismi all silmas eelkõige pärimisest tulenevat
polümorfset käitumist
13. Mis vahe on meetodi override (ülekirjutamine) ja overload 'il (ülelaadimine)?
Override: Alamklass
defineerib sama nime ja
samade argumentidega meetodi. Tagastustüüp peab olema
sama või originaaltüübi alamtüüp.
Overload: Mitu sama nime, kuid erinevate argumentidega meetodit. Üle
laadida saab nii ülemklassi kui
ka sama klassi meetodit
14. Mida tagastab static factory method ?
Static factory method on alternatiiv konstruktorile – loote objekti staatilise meetodi sees ja tagastate
selle. NB! Ei tagasta mitte klassi, vaid objekti!
Kontrollite väljastatud objektide arvu: Võimaldab „kallite” objektide taaskasutust, nt
andmebaasiühendus
Kontrollite väljastatud objekti tüüpi: Väljastate lubatud tüübi asemel mõne optimiseeritud alamtüübi.
Miks tagastada alamtüüp?
Optimiseerimine – sobiv alamtüüp vastavalt andmete mahule või töökeskkonnale
Äriloogika – sobiv alamtüüp vastavalt sisendargumendile (static factory method võib võtta ka
argumendi)
15. Mis vahet on static factory methodil ja konstruktoril? Kas need välistavad teineteist?
Konstruktorite konflikt:
public Product(int
weight ) { }
public Product(int
length ) { }
Parameetrid weight ja length on erinevad, kuid sama tüüpi – kahte sellist konstruktorit luua ei saa
16. Tundke vähemalt kolme põhjust, miks kasutada static factory methodit
1.Static factory
meetoditel on nimed, nii et me saame kasutada rohkem kui üks factory method sama
signatuuriga, mida ei saa teha konstruktorite puhul.
2.Factory meetoditel ei ole vaja luau uut objekti: nad võivad tagastada eelnevalt loodud objekti.
3. Factory meetodid võivad tagastada object
igat alamtüübi, konstruktorid ei saa.
17. Mida hoitakse pinus ( stack ) ja kuhjas ( heap )? (Oluline teada ainult aines käsitletu piires).
Stack ( pinu ) on mälupiirkond, kus:
Kohene mälueraldus muutujatele nende deklareerimisel
Siin hoitakse primitiivset tüüpi väärtusi
Üks stack iga lõime (threadi) ehk käivitatava ühiku kohta
Heap ( kuhi ) on mälupiirkond, kus: Mälueraldus vajaduse tekkimisel
Siin hoitakse objektitüüpe
Üks heap terve JVM kohta
18. Mil määral saab null-viidaga objekti kasutada?
null – praktilise käsitluse jaoks lihtsalt puuduv väärtus
Sõnega „null” on seotud spetsiaalne nulltüüp
Null-tüübi väärtus on alati null-viide
Nulltüübil puudub nimi, ei saa deklareerida
Objekti ei saa teisendada null-
tüübiks .
Null-tüüpi väärtuse (null-viida) võib omistada ükskõik millisele objektitüübile
Null-
viitega muutujal ei saa välja kutsuda defineeritud tüübi meetodeid ega kasutada välju
Objekt võib puududa :
Andmebaasipäringu vastus
Veebiteenuse vastus
Konfiguratsiooni osa
Süsteemi
komponent 19. Mis on Optionali peamine mõte Java programmis ?
Võimaldab selgelt väljendada, kui väärtuse puudumine on planeeritud stsenaarium
Optional optProd = Optional.of(
prod ); static factory method
optProd = Optional.ofNullable(prod); Me ei ole kindlad, kas objekt on olemas või null
20. Milleks kasutatakse Maven ja Gradle ?
Maven is a
tool that can help in creating,
building , publishing and managing dependencies for many
applications. Maven is not
bound to Java (Homepage) and it can be used with
other programming
languages such as PHP (Homepage). It is very
easy to use and definitely worth its
money (note that
Maven is free) when compared with the time saved from doing the
repetitive things ourselves.
Maven is a
build automation tool used primarily for Java
projects . The word
maven means 'accumulator
of
knowledge ' in Yiddish.[3]Maven addresses two aspects of building software: First, it describes how
software is built, and second, it describes its dependencies. Contrary to preceding tools like
Apache Ant,
it uses conventions for the build procedure, and only
exceptions need to be written down. An XML file
describes the software
project being built, its dependencies on other
external modules and
components , the build
order , directories, and
required plug-ins. It
comes with pre-defined targets for
performing certain well-defined tasks such as
compilation of code and its packaging. Maven dynamically
downloads Java libraries and Maven plug-ins from one or more repositories such as the Maven 2 Central
Repository, and stores them in a
local cache .[4] This local cache of downloaded artifacts can also be
updated with artifacts created by local projects. Public repositories can also be updated.
lternative technologies like gradle and sbt as build tools do not rely on XML, but
keep the key concepts
Maven introduced. With Apache Ivy, a
dedicated dependency
manager was
developed as well that
also supports Maven repositories.
Gradle is a project automation tool that builds
upon the concepts of Apache Ant and Apache Maven and
introduces a Groovy-baseddomain-specific
language (DSL) instead of the more traditional XML form of
declaring the project configuration.
Unlike Apache Maven, which defines lifecycles, and Apache Ant, where targets are invoked based upon
a depends-on partial ordering, Gradle uses a directed acyclic
graph ("DAG") to determine the order in
which tasks can be run.
Gradle was
designed for
multi -project builds which can
grow to be quite large, and supports incremental
builds by intelligently determining which parts of the build tree are up-to-
date , so that any
task dependent upon those parts will not need to be re-executed.
The initial plugins are primarily focused
around Java, Groovy and
Scala development and
deployment ,
but more languages and project workflows are on the roadmap.
21. Tehke selgeks abstraktse klassi peamised omadused (mis on abstraktne meetod, kas abstraktsest
klassist saab objekti luua ning millises olukorras eelistada abstraktset klassi liidesele).
Praktiline info: sellisest klassist ei saa luua objekti
Sellist klassi saab laiendada ja defineerida abstraktseid meetodeid – sarnane liidesega
Abstraktset klassi kasutame reeglina ülemtüübina, kus saame meetoditele ka konkreetse realisatsiooni
pakkuda
Liidest kasutame eelkõige sellise käitumise spetsifitseerimiseks, mis ei ole seotud kindla tüübiga
22. Mida kontrollib == operaator ? Mida teeb equals()?
Primitiivsete tüüpide korral sisulist võrdsust: int a = 3; int b = 3; if (a == b) { // on võrdsed }
Objektitüüpide korral samasust:
Student a = new Student(„Mary”); Student b = new Student(„Mary”); if
(a == b) { // ei ole samad }
Objektitüüpide korral kontrollib, kas tegu on sama objektiga kuhjas (heap)
equals() on meetod, mille eesmärk on kontrollida objektide sisulist võrdsust
Objektide korral kontrollib equals vaikimisi sama, mida ”==”: kas kaks
viita viitavad samale objektile
Objektide korral
kasutage equals(), aga:
Objektitüübi jaoks tuleb equals() üle kirjutada, vaikeimplementatsioon Object klassis kontrollib, kas tegu
on sama objektiga
Stringi (jt Java tüüpide) jaoks on Java
arendajad selle töö teinud. Enda tüüpide jaoks peate ise equals()-i
üle kirjutama
23. Millist tüüpi argumendi võtab equals() meetod? Miks?
equals() omadused :
Sümmeetria: a.equals(b) saab olla tõene ainult siis kui ka b.equals(a)
Refleksiivsus: a.equals(a)
Transitiivsus: kui a.equals(b) ja b.equals(c), siis a.equals(c)
Object obj
24. Kas õigesti realiseeritud hashCode() on alati igal objektil unikaalne (vt 7. nädala materjalidest ). Meetod, mis tagastab objektile unikaalse räsiväärtuse (hashi), mis ei tohi muutuda kui objekti olek ei
muutu.
Initsialiseerige üheks: int hashCode = 1;
Primitiivse numbrilise tüübi korral korrutage: 31 * hashCode + value
Objektitüübi korral kasutage väärtuse asemel objekti hashCode()
Kui: a.equals(b) ..siis: a.hashCode() tagastatav
räsi on identne b.hashCode() tagastavaga
Ilma nähtavuse võtmesõnata koodiühik on kasutatav paketi sees.
Laiendav klass pärib kõik laiendatava klassi meetodid, mis ei ole private ning kirjutab üle kõik
sama signatuuriga meetodid ülemklassis. Public
class Laiendav(alamtüüp) extends
Laiendatav(ülemtüüp).
Kompositsioon – üht tüüpi objekti(osa) kasutamine teise objekti sees(tervik)
Liides: Public
interface a; Class k implements a; Kui klass realiseerib lidest, võib objekti tüübi
deklareerida liidese abil: SomeInterface s = new MyClass(); Eeldus, et MyClass implements
SomeInterface
Geneerilised tüübid: Kui me konkreetset tüüpi ei tea, kasutame tüübimuutujat, selle n imi on
kokkulepeline. Geneerilisest klassist saab luua ka nn toortüüpe(raw type). Eelistame geneerilist
tüüpi objekti loomisel,mitte raw type.
Wildcard. Tüüp ei ole teada. Geneerilise tüübi puhul
omistatakse tüüp objekti loomisel, wildcard
tüübi puhul kasutatakse enamasti Object.
Seostamine ehk binding . Lahendus: tuleb luua seos meetodi väljakutse ja meetodi keha vahel.
Teie teete meetodi väljakutse, Java otsib sobiva meetodi keha. Alamklass – ülemklass näide:
ülemklassi meetod asendatakse alamklassi
omaga . Javas on enamik meetodeist virtuaalsed (v.a
static,
final , private), st meetodid ei ole staatiliselt seostatud klassiga, vaid õige konfiguratsioon
paigaldatakse töö ajal
Kõik kommentaarid