Java- opasSisällysluettelo
YleistäJava on:
Javalla voidaan ohjelmoida:
Javalla voidaan PC-ympäristössä ohjelmoida erityyppisiä sovelluksia:
Sun tarjoaa hyvän oppaan Javan opiskeluun. SyntaksiJokainen Javan käsky lopetetaan joko puolipisteeseen tai kaarisulkuun (Kaarisulku voi olla jollakin seuraavalla rivillä).Luokat ja paketitKaikki Java- koodi kirjoitetaan luokkiin, jotka kuuluvat johonkin pakettiin. Jokaista java luokkaa vastaa java-päätteinen tiedosto ja paketti on hakemisto, jossa on paketin luokat. Java-luokassa esim. Radio ilmoitetaan ensin paketti esim. package fi.yritys.esimerkki; ja tämä tiedosto tallennetaan fi/yritys/esimerkki-hakemistoon Radio.java nimellä. Paketti määreen jälkeen luokkaan kirjoitetaan luokka määre, joka on tässä public class Radio { } Viittaukset muihin luokkiinLuokassa voidaan tarvita luokkia toisista paketista. Näihin viittaminen tehdään package- ja class määritteiden väliin esim. import java.util.Date; viittaa java.util-paketin Date- luokkaan. Viittauksen ansiosta ko. luokkaa voidaan käyttää myöhemmin Radio-luokassa. Poikkeukset viittauksien käyttöön:
KommentitKommentteja on kolmenlaisia:
NäkyvyysmääreLuokkia, metodeja, luokan muuttujia ja olion muuttujien näkyvyyksiä voidaan vaihdella seuraavilla määreillä:
Esimerkki näkyvyysmääreen käytöstä: private Date settingsModified; //Luokan sisällä tieto, koska radion asetuksia viimeksi muutettu Muuttujat ja vakiotMuuttujia voi olla luokalla, oliolla tai jonkun lohkon sisällä esim. ehtolauseen, metodin tai toistolauseen Muuttujan arvosta tehdään vakio final -sanalla. Esim. final Date defaultDate = new Date(-1); Olion muuttujasta tehdään luokan muuttuja static sanalla esim. static final Date defaultDate = new Date(-1);KonstruktoritOlion luonnin yhteydessä kutsutaan konstruktoria, joka voidaa jättää myös kirjoittamatta. Konsturktorin oltava samanniminen kuin luokan, jossa se sijaitsee. Esimerkki konstruktorin määrittelystä. public Radio() { /* Toteutus kirjoitetaan kaarisulkeiden sisään */ }. Konstruktori voi saada myös parametrin tai useita esim. public Radio(String manufacturer, String model) { /* Toteutus kirjoitetaan kaarisulkeiden sisään */ } MetoditLuokalla ja oliolla voi olla metodeja, jotka palauttavat arvon. Luokan metodit määritellään static- sanalla kuten muuttujissa. Esimerkki olion metodin määrittelystä public void turnOn() { /* Toteutus kirjoitetaan kaarisulkeiden sisään */ }:PoikkeuksetVirhetilanteet erotetaan koodista poikkeuksien käsittelyllä. Metodit heittävät poikkeuksia, jotka voidaan ottaa kiinni. Poikkeuksia voivat olla ajonaikaisia, jolloin kääntäjä ei pakota käsittelmään niitä. Esimerkki ajonaikaisesta poikkeuksesta on java.lang.NullPointerException, joka ilmoittaa että yritetään kutsua oliota, jota ei ole olemassa. Esimerkki poikkeuksen määrittelystä (java.lang.IllegalStateExcepion heitetään, jos radio yritetään käynnistää uudestaan): public void turnOn() throws IllegalStateException { /* Toteutus kirjoitetaan kaarisulkeiden sisään */ } Esimerkki poikkeuksen käsittelystä
try {
radio.turnOn();
//Tryn sisällä olevan koodin suorittaminen lopetetaan ensimmäiseen heitettyyn poikkeukseen
//Jos radio:n turnOn-metodi heittäsi poikkeuksen ja tässä olisi koodia, sitä ei suoritettaisi
}
catch(IllegalStateException e) {
//Radio on jo päällä
//Ei tehdä mitään muuta
}
catch(RuntimeException e) {
//Catch lohkoja voi olla useita - yhdessä try:ssä ja enintään yksi niistä suoritetaan
//Tämä on turha, koska ajonaikaiset poikkeukset lentäisivät jokatapauksessa eteenpäin
throw e;
}
finally {
//Finally lohko suoritetaan joka tapauksessa lensi poikkeuksia tai ei
}
EhtorakenteetJavassa on kaksi ehtorakennetta:
Esimerkki if- else rakenne:
//status on String luokan olio
//if- else- rakenteessa voi oltava yksi if- lause
//if- else- rakenteessa voi olla yksi tai useampi if- else lauseita
//if- else- rakenteessa voi olla yksi else- lause
if("start".equals(status)) {
//Ehto voitaisiin kirjoitta myös status.equals("start").
//Erona olisi, että voidaan kutsua equals -metodia oliolle jota ei ole olemassa ("start"-String on aina olemassa, toisin kuin status- olio)
//Seurauksena olisi NullPointerException
//Status olion sisältönä oli "start"
}
else if("shutdown".equals(status)) {
//Status olion sisältönä oli "shutdown", tämä tutkiminen tehdään vain, jos ei ollut "start"
}
else if("sleep".equals(status)) {
//Status olion sisältönä oli "shutdown", tämä tutkiminen tehdään vain, jos ei ollut "start" eikä "shutdown"
}
else {
//Status olion sisältö on tuntematon tai olio on null
throw new MyRuntimeException("Invalid status: '" + status + "'");
}
Poikkeukset ehtorakenteen käyttöön:
Vaikeasti löydettävä virhe on kirjoittaa ylimääräinen puolipiste: esim. if("start").equals(status); {, koska kääntäjä ei herjaa, mutta kaarisulun sisälle mennään aina riippumatta if- ehdosta Esimerkki switch- case rakenteesta:
//Kaikki switch case- rakenteet voidaan toteuttaa myös if- else rakenteella
//switch casessa tutkittavan muuttujan oltava primitiivi, josta on oma kappale
switch(myInt) {
case 1:
//myInt on 1
//Suoritetaan vain tämä lohko
break;
case 2:
//myInt on 2
//Suoritetaan tämä ja seuraava lohko, koska ei ole breakkiä lopussa
case 3:
//myInt on 2 tai 3
break;
default:
//myInt ei ole 1, 2 tai 3
}
PrimitiivitAinoan poikkeuksen Javan olio maisuuteen tekee on muutama primitiivi:
Lisätietoja primitiiveistä Primitiivinen vertaileminen tapahtuu olioista poiketen seuraavilla operatioilla:
ToistorakenteetJavassa on kolme toistorakennetta:
Kaikilla toistorakenteilla voi tehdä saman asian. For-toistorakenne on käytetyin. Esimerkki for- toistorakenteesta:
for(int i = 0; i < 10; i++) {
//Tämä toistorakenne tehdään kymmenen kertaa
//Ensimmäisellä kierroksella alustetaan int- muuttuja i nollaksi
//Joka kierroksella verrataan onko i pienempi kuin 10
//Joka kierroksella kasvatetaan i:tä yhdellä (i++ voisi olla myös muotoa i += 1 tai i = i + 1)
}
Esimerkki while- toistorakenteesta:
int i = 0;
while(i < 10) {
i++;
//Toistorakenne toimii kuten edellinen for-toistorakenne
}
Esimerkki do while- toistorakenteesta:
int i = -1; //Huomaa alustus arvo yhden pienempi kuin muista toistorakenteissa
do {
i++;
//Toistorakenne toimii kuten edelliset for- ja while-toistorakenteet
//Do while- rakenne suoritetaan ainakin kerran, koska ehdon tutkiminen tehdään lohkon suorituksen jälkeen
//Muissa toistorakenteissa ehto tutkitaan ennen toistorakenteen lohkon suoritusta.
while(i < 10)
}
TaulukotJavassa taulukot määritellään hakasuluilla. Taulukot ovat olioita, joilla on muuttuja lenght, joka kertaa taulukon koon. Kokoa ei voi muuttaa, jos tarvitset muuttaa taulukon kokoa useasti, käytä esim. java.util.List- rajapintaa sekä java.util.ArrayList- luokkaa. Taulukon alkiot saavat oletus sisällön (oliolla null, luku primitiiveillä 0 ja boolean primitiivi false) Esimerkkejä taulukon käytöstä:
//Taulukko voidaan alustaa tyhjäksi ilman kokoa: String[] myArray;
//Taulukko voidaan alustaa tyhjäksi ja tietyn kokoiseksi: String[] myArray = new String[10];
//Hakasulut voivat olla myös taulukon nimen perässä (ei suositella): String myArray[] = new String[10];
String[] myArray = {"Matti", "Miina", "Mauri"};
//Toistorakenne tulostaa ruudulle:
//Taulukon 1. alkio: Matti
//Taulukon 2. alkio: Miina
//Taulukon 3. alkio: Mauri
for(int i = 0; i < myArray.length; i++) {
System.out.println("Taulukon " + (i + 1) + ". alkio: " + myArray[i]);
}
Enumeraatiot *Ylemmille syntaksi tiedoilla pärjäät jo. Jos haluat, kannattaa myös nämä tähdellä merkityt asiat lukea. Java 5:ssa mukaan tullut ominaisuus määritellä enumeraatiota omiin tiedostoihin. Esim.
public enum Day {
MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Rajapinnat ja abstraktit luokat *Joskus on tarvetta tehdä yleistyksiä, jolle tehdään useita erilaisia toteutuksia. Rajapinnan kaikki metodi toteutukset ovat tyhjiä. Abstraktissa luokassa osa toteutuksista voi olla valmiina. Hyvä esimerkki tästä tarpeesta on java.lang.Comparable- rajapinta, jolla oliot voidaan järjestyy järkevään järjestykseen listoissa - kaikki oliot toteuttavat samanrajapinnan vaikka niiden toteutus on hyvinkin erilainen esim. ihmiset järjestetään yleensä suku- ja etunimen perusteella kun autot merkin ja mallin perusteella. Esimerkki rajapinnasta:
public interface MyVehicle {
public void drive(); //Ei kaarisulkuja, tyhjä toteutus
}
public class Car implements MyVehicle {
public void drive() {
//Toteutus olisi moottori käyntiin jne.
}
}
public class Cycle implements MyVehicle {
public void drive() {
//Toteutus olisi jalat liikkeelle jne.
}
}
Esimerkki abstraktista luokasta:
public abstract class MyVehicle {
public void cleanUp() {
//Toteutus olisi sama kaikille kulkupeleille eli harja käteen ja menoksi.
}
public abstract void drive(); //Ei kaarisulkuja, tyhjä toteutus
}
public class Car extends MyVehicle {
public void drive() {
//Toteutus olisi moottori käyntiin jne.
}
}
public class Cycle extends MyVehicle {
public void drive() {
//Toteutus olisi jalat liikkeelle jne.
}
}
Perintä *Luokat voivat periä metodit ja muuttujat toiselta luokalta (jollei perimistä ole estetty luokan final- määreellä). Luokka voi periä vain yhden luokan. Rajapinta voi periä useita rajapintoja. Perintää käytetään helposti liikaa, mutta perusteltuja paikkoja on periä omat poikkeukset.
public class MyRuntimeException extends RuntimeException {
public MyRuntimeException(String message) {
super(message); //Kutsutaan yläluokan konstruktoria, super- määreellä voidaan viitta myös metodeihin ja muuttujiin
}
}
Kastaus *Ylemmän luokan oliossa voi olla aliluokan olio. Aliluokan olion tietoihin (joita ei ole yläluokassa) päästään käsiksi kastaamalla:
List list = new ArrayList();
list.add("teksti");
//Tiedetään, että listassa on String- olio (List- olio palautta Object- olion), joka lähetään eteepäin
//Jos tarvitsee tutkia olion tyyppiä (harvinaista) se onnistuu instanceof -komennolla
//Object object = list.get(0);
//if(object instanceof String) {
// Tehdään jotain
//}
String text = (String)list.get(0);
sendText(text);
Tyypittäminen (eng. generics) *Kastauksessa on ongelma, että kääntäjä ei huomaa virheitä (ClassCastException). Java 1.5:ssä avuksi tuli tiedon tyypittäminen:
//Listaan ei voida enää lisätä muita Object- olioita kuin String- olioita (sekä sen periviä olioita)
List<String> list = new ArrayList<String>();
list.add("teksti");
String text = list.get(0);
sendText(text);
Ylikuormittaminen *Metodilla voi olla useita samannimisiä metodeja, joilla on eri parametrit:
public void drive() {
//Ajetaan vain perille
}
public void drive(RadioChannel radioChannel) {
//Ajon lisäksi kuunnellan radiota
radioChannel.open();
this.drive();
radioChannel.close();
}
public void drive(Speech speech) {
//Ajon lisäksi valmistellaan miellessä puhetta
speech.prepare();
this.drive();
speech.pause();
}
Pieni yksityiskohta: Kääntäjä antaa herjan, jos kutsutaan drive- metodia arvolla joka on aina tyhjä, koska se ei tiedä kuunnellaanko radiota vai valmistellaanko puhetta. Bittioperaatiot *Bittioperaatio voidaan tehdä vain primitiivien kokonaisluvuille.
Sisäkkäiset luokat *Luokkien sisään voidaan määritellä sisäkkäisiä luokkia, joiden käyttöä vältettävä, koska eivät tuota selkeää koodia. Perusteltu käyttökohde on esim. sovelluksen yksikkötestauksessa voidaan toteuttaa esim. konfiguraatio rajapinta palauttamaan halutut konfiguraation arvot.
public class MyClass {
private class InnerClass {
//Sisäluokan näkyvyys määre voi olla muutakin kuin private
}
}
Paluu etusivulleni...
APIJavadocin lukeminen on avain Java APIin. Javadoc kannattaa ladata omalle koneelle. Javan API on valtavan kokoinen, joten tässä hieman parhaita paloja, jotka helpottavat asioiden ymmärtämistä. java.io
java.lang
java.math
java.net
java.sql
java.text
java.util
java.util.concurrent
java.util.concurrent.locks
java.util.jar
java.util.regex
Paluu etusivulleni... |