Java ülevaade
- Java süntaks
- Oracle Java tutorial, Java keele osa
- Teemad 1-3 ja 5-6 peaks olema OOP-ist tuttavad (mõned alamteemad välja arvatud). Vaata üle, millised teemad on võõrad!
- 4. teema, Annotatsioonid, võiks üle vaadata, aga väga tähtsaks me praegu seda ei pea.
- Viimaseid teemasid, geneerikud ja paketid, käsitleti OOP-is väga põgusalt, aga selles kursuses on need vajalikud.
- Oracle Java tutorial, Essential classes
- Siit peaks olema enam-vähem tuttavad "Exceptions" ja "Basic I/O" osad.
- Oracle Java tutorial, tähtsamat andmestruktuuride liidesed, peaksid olema OOP-ist tuttavad.
- Java 8 API
- http://www.allimant.org/javadoc/ -- sama info CHM formaadis
- http://zealdocs.org/ -- dokumentatsiooni brauser
- http://kapeli.com/dash -- Mac'i jaoks
Terminoloogia
- class: klass
- interface: liides
- NB! Nii eesti kui inglise keeles on sellel sõnal ka üldisem tähendus: http://en.wikipedia.org/wiki/Interface_%28computing%29
- type:
- ühine nimetaja klassi või liidese jaoks
- (avaldise või muutuja) tüüp
- subtype
- subclass
- overloading: üledefineerimine
- Küsimus: miks Java toetab üledefineerimist? Mida see annab?
- overriding: ülekatmine
- polymorphism: polümorfism ...
- casting
- väärtuse teisendus (nt.
double x = 2.5; int n = (int)x
) - tüübi täpsustamine (nt.
Object obj = ...; Lammas lammas = (Lammas)obj
), öeldakse ka downcasting.- Küsimus: miks downcasting? Kas upcasting on võimalik/vajalik?
- väärtuse teisendus (nt.
Geneerikud e. parameetrilised tüübid (ingl generics)
Parameetriliste tüüpide idee on kaunis lihtne, aga selle kombineerimine alamtüüpimisega tekitab palju nüansse, mida vastav osa Oracle Java tutorialist üritab selgitada.
Meil praegu kõiki nüansse tarvis teada pole. Vaja on osata geneerilisi tüüpe tavalistel juhutudel kasutada (enamasti andmestruktuuridena, seda OOP-is käsitleti) ning defineerida (seda OOP-is ei käsitletud).
Iseseisev harjutus: Implementeerida lihtsustatud variant ArrayList
-ist
Ei pea realiseerima kogu List
liidest. Piisab kui konstruktor teeb alati tühja listi, add
meetod lisab ja get
meetod võtab indeksi järgi.
Esialgu on soovitav teha lihtsam variant: listi elementide hoidmiseks võib sisemas kasutada mingit olemasolevat List-i implementatsiooni.
Võib võtta šnitti järgmisest klassist:
class Box<T> { private T value; public Box(T value) { this.value = value; } public T getValue() { return this.value; } }
Lõpuks tuleks variant, kus listi elemendid hoitakse massiivis. See ei lähe tõenäoliselt nii libedalt, sest massiividel on geneerikutega oma teema. Enne abi küsimist proovi siiski jõuda ise lahenduseni (guugeldamine on OK).
Paketid (ingl packages)
Vaata üle vastav osa Oracle Java tutorialist.
Kontrollküsimused
- Kuidas saab vaikepaketis olevas klassis kasutada klassi
C1
, mis asub paketisa.b.c
? (Siin on vähemalt kaks võimalust) - Kuidas saab paketis
a.b.c
olevas klassis kasutada klassiC2
, mis asub vaikepaketis? - Milliseid järgmistest klassi
C1
meetoditest on võimalik kasutada klassisC2
, kui mõlemad klassid asuvad paketisa.b.c
jaC1
nähtavus onpublic
:private void f1()
private String f2()
protected String f3()
public String f4()
String f4()
private static void sf1()
private static String sf2()
protected static String sf3()
public static String sf4()
String static sf4()
- Aga kui
C1
nähtavus on package private (st. ta on defineeritud ilma nähtavuse modifikaatorita)?
Varargs
Vt. jaotus "Arbitrary number of arguments" lehel http://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html
Java infrastruktuur: JVM, javac, jar, classpath
- http://docs.oracle.com/javase/tutorial/essential/environment/cmdLineArgs.html
- http://docs.oracle.com/javase/tutorial/essential/environment/paths.html
Harjutus: Escape HTML
Oletame, et su programmil on vaja küsida kasutajalt mingi lõik teksti ja koostada sellest lihtne HTML lehekülg, kus see tekst on pandud üheks lõiguks, nt. midagi sellist
<html> <head><title>... kasutaja poolt käsurealt antud pealkiri ...</title></head> <body> <h1>... kasutaja poolt käsurealt antud pealkiri ...</h1> <p> ... kasutaja poolt sisestatud tekst ... </p> </body> </html>
Lihtsal juhul aitaks väikesest sõnekonkatenatsioonist, aga mis siis, kui kasutaja tekstis sisaldub mõni HTML erisümbol, nt. <
? Õige oleks need erisümbolid enne escape'ida. Oletame, et selle lahendamiseks meeldib sulle variant, mida pakutakse siin: http://stackoverflow.com/a/6749280/261181
Kuidas edasi? Proovi lahendada see ülesanne, ja käivitada loodud programmi nii läbi IDE kui ka käsurealt. Kuidas käivitada sama programmi nii, et lõigu sisu ei pea mitte sisse tippima vaid selle saab anda ette mingist failist?
Stiil
Java keele spetsifikatsioon ei määra, kuidas tuleb joondada loogelisi sulge, kas klassi nimi peaks olema kuu_eelarve
, kuueelarve
või Kuu_Eelarve
jms. Samas on siiski hea, kui tiimis lepitakse ka sellistes küsimustes kokku. Üks laialt kasutatav stiilijuhis on Google'i oma: https://google.github.io/styleguide/javaguide.html
Java 8
Kust leiab täpsemat infot?
Proovi vastata järgnevatele küsimustele.
- Kas ühes klassis võivad olla meetodid signatuuridega
void f(int x, int y)
javoid f(int y, int x)
? - Aga
void f(int x, int y)
javoid f(int y, Integer x)
? - Aga
int f()
jaString f()
? - Aga
int f(int x)
jaString f(float x)
?
Nende vastuste peast teadmine pole väga oluline, aga vajadusel peaksid oskama vastuse leida. Kui sa pole kindel keele mingi nüansi osas, siis:
- Katseta! IDE ja javac teavad Java reegleid päris hästi ;)
- Guugelda!
- Uuri järele:
- Oracle Java tutorial
- Java Language Specification -- mitte just kõige kergem lugemine, aga sellest võib olla abi ka siis, kui kõigist lausetest aru ei saa.
- Boonus: mõtle, kuidas see nüanss peaks olema! Võibolla disainid just sina kunagi uue ja parema programmeerimiskeele ;)