Osan kaikki tehtävät
huomautus
Jos palautat tehtävät ennen osion takarajaa (ma 2.2.2026 klo 11:59 (keskipäivä)), voit saada DL-BONUS-pisteitä harjoitustehtäviin. Lue lisää suorittaminen-sivulta.
Tee luokka Tuote. Tee sille attribuutit nimi (merkkijono) ja hinta
(desimaaliluku). Aseta attribuuttien arvot konstruktorissa. Tee myös metodi
void tulostaTiedot(), joka tulostaa tuotteen nimen ja hinnan muodossa "Nimi: Hinta
€".
Peri Tuote-luokasta luokat Vaate ja Ruoka. Perivien luokkien
konstruktoreissa ei tarvitse tehdä muuta kuin kutsua yläluokan
konstruktoria oikeilla arvoilla.
Tee nyt ohjelmassasi kaksi erilaista vaatetta ja kaksi erilaista ruokatuotetta
ja tulosta niiden tiedot kutsumalla void tulostaTiedot()-metodia.
Jatketaan edellistä tehtävää. Peri Tuote-luokasta myös luokka Elektroniikka.
Lisää erityispiirteitä kuhunkin aliluokkaan:
Vaate: attribuuttiString koko(esim. "M", "L", jne.), metodivoid sovita(String sovittajanKoko), joka tulostaa, onko vaate sopiva sovittajalle.Elektroniikka: attribuuttiint takuuKuukausina(esim. 24), metodiint takuutaJaljella(int kuukausiaKulunut)palauttaa montako kuukautta takuuta on jäljellä (tai 0, jos takuu on umpeutunut).Ruoka: attribuuttiString parastaEnnen(esim. "31.01.2026"), ja metodivoid syo(), joka tulostaa "Nautit ruoan, jonka viimeinen käyttöpäivä on DD.MM.YYYY." (korvaa DD.MM.YYYYparastaEnnen-arvolla).
Huomaa, että perivien luokkien konstruktoreissa tulee nyt kutsua yläluokan konstruktoria oikeilla arvoilla, sekä asettaa omat attribuutit.
Tehtäväsivulla on valmiiksi annettuna pääohjelma. Käytä sitä luokkiesi testaamiseen. Se ei saa tuottaa käännös- tai ajonaikaisia virheitä. Voit kuitenkin halutessasi lisätä pääohjelmaan omaa koodiasi.
EDIT 30.1.2026: UML-kaavio korjattu vastaamaan tehtävänantoa
EDIT 29.1.2026: UML päivitetty vastaamaan tehtävänantoa
Laajenna aiemmin tekemääsi verkkokaupan luokkahierarkiaa alla olevan UML-kaavion mukaisesti. Saat kuvan suuremmaksi oikeaklikkaamalla (Windows) tai Control-klikkaamalla (macOS) sitä ja valitsemalla "Avaa kuva uudessa välilehdessä".
Tehtäväsivulla on valmiiksi annettuna pääohjelma, jota voit käyttää luokkiesi testaamiseen.
Avaa tästä ohjelman antama esimerkkituloste.
Kutsutaan perittyjä metodeja:
Talvitakki Dulce & Käppänä: 120.0 €
Ruisleipä Reissurähjä: 2.5 €
Tietokone HighPower: 899.0 €
----------------------------
Kutsutaan omia metodeja:
Testi 1: Sovitetaan M-kokoista käyttäjää:
Sovitetaan vaatetta Talvitakki Dulce & Käppänä...
Ei välttämättä sopivin koko. Sinä olet kokoa M, mutta tämä vaate on L.
Testi 2: Sovitetaan L-kokoista käyttäjää:
Sovitetaan vaatetta Talvitakki Dulce & Käppänä...
Mahtavaa! Koko L istuu sinulle täydellisesti!
Syödään Ruisleipä Reissurähjä.
Parasta ennen oli 20.12.2024, toivottavasti on hyvää.
Takuuta jäljellä: 19 kk.
pHone: 999.99 €
Takuuta puhelimessa jäljellä: 19 kk
Käyttöjärjestelmä: Orange
Yhteystyyppi: 4G
Soitetaan käyttöjärjestelmästä Orange(4G) numeroon 0401122330
Hernepussi: 0.99 €
Sulatit pakastetta Hernepussi 10 minuuttia. Säilytyssuositus on -18 astetta C.
Syödään Hernepussi.
Parasta ennen oli 31.5.2026, toivottavasti on hyvää.
Tehtävän kuvaus sanallisessa muodossa
Tässä on kuvaus uusista luokista ja niiden vaadituista ominaisuuksista. Löydät vastaavat tiedot UML-kaaviosta.
-
Puhelin(periiElektroniikka)- Lisää attribuutit:
private String kayttojarjestelma(esim. "Droid" tai "AiOS")private boolean onko5G
- Lisää metodit:
public void soita(String numero). Metodi tulostaa esimerkiksi:Soitetaan käyttöjärjestelmästä Orange(4G) numeroon 0401122330public void tulostaPuhelimenTiedot(int kuukausiaKulunut). Metodin tulee kutsua ensin perittyä metodia (tulostaTiedot()), ja sitten tulostaa puhelimeen liittyvät lisätiedot (jäljellä olevan takuuajan, käyttöjärjestelmän ja 5G-tuki).
- Lisää attribuutit:
-
Pakaste(periiRuoka)- Lisää attribuutti:
private int lampotilaSuositus(esim. -18)
- Lisää metodi:
private void sulata(int minuutit)(huomaa private-määre)- Kun metodia kutsutaan, se tulostaa esimerkiksi:
Sulatat pakastetta 10 minuuttia. Säilytyssuositus: -18 C.
- Lisää metodi:
public void sulataJaNauti(int minuutit)- Metodi kutsuu ensin
sulata(minuutit)-metodia ja sitten perittyäsyo()-metodia.
- Lisää attribuutti:
EDIT 29.1.2026: Kiitos palautteestanne. Poistin selityksen puhelimen tietojen
tulostamisesta. Tämän tehtävän tavoitteena on harjoitella toString()-metodin
ylikirjoittamista. Jos vielä on epäselvyyksiä, niin älkää epäröikö laittaa
palauteboksiin kommenttia tai sähköpostia.
EDIT 29.1.2026: Luokan SahkoAuto nimi muutettu Sahkoauto-muotoon, kuten
TIMissäkin oli.
Luokissa Tuote, Elektroniikka ja Puhelin ylikirjoita metodi toString(),
jossa kutsut ensimmäisenä yliluokan toString()-metodia, ja sen jälkeen yhdistä
merkkijonoon luokan omista attribuuteista tietoja.
Tehtäväsivulla on valmiiksi annettuna pääohjelma, jota voit käyttää luokkiesi testaamiseen.
Avaa tästä, mitä ohjelma voisi esimerkiksi tulostaa.
Tietokone HighPower: 899.0 €
Takuuta laitteessa alunperin: 24 kk
Aifoun42: 888.0 €
Takuuta laitteessa alunperin: 37 kk
Käyttöjärjestelmä: AiOS
Yhteystyyppi: 5G
----------------------------
--- UUSI KAUPAN TUOTE ---
Light Bulb: 67000.0 €
Takuuta laitteessa alunperin: 73 kk
Akun kunto: 100.00
Toimintasäde: 404.00 km
--- KÄYTTÖÖNOTTO JA LATAUS ---
Ladataan autoa Light Bulb...
Ladataan autoa Light Bulb...
Ladataan autoa Light Bulb...
Ladataan autoa Light Bulb...
Ladataan autoa Light Bulb...
--- TILANNE LATAUSTEN JÄLKEEN ---
Light Bulb: 67000.0 €
Takuuta laitteessa alunperin: 73 kk
Akun kunto: 99.50
Toimintasäde: 401.98 km
Laajenna luokkahierarkiaa edelleen. Lisää Sahkoauto-luokka, joka perii
Elektroniikka-luokan.
Lisää luokkaan
- attribuutit
- vakio
TOIMINTASADE_MAX, joka ilmaisee maksimietäisyyden kilometreinä, jonka sähköauto voi kulkea yhdellä latauksella. private double akunKunto(prosentteina; väliltä 0-100)
- vakio
- metodit
lataa(), joka heikentää akun kuntoa 0.1%:lla jokaisella latauskerralla.toString(), joka kutsuu ensin yliluokan metodiatoSTring(), jonka jälkeen tulostaa akun kunnon prosentteina ja sitten toimintasäteen kilometreinä, jonka laskemiseen hyödynnetään kaavaa: (akunkunto / 100 * TOIMINTASADE_MAX).
Tee luokka Ajoneuvo, jolla on attribuutti String merkki ja konstruktori joka
asettaa tämän arvon. Lisää myös metodi liiku(), joka ei tee mitään.
Peri Ajoneuvo-luokasta luokat Auto ja Lentokone. Tee Auto- ja
Lentokone-luokkiin liiku()-metodi, joka ylikirjoittaa Ajoneuvo-luokan
liiku()-metodin. Auto-olio tulostaaa "Auto <merkki> ajaa maantiellä
renkaat vinkuen.", ja Lentokone-olio "Lentokone <merkki> nousee kiitotieltä
ja lentää pilvien päällä.".
Tee pääohjelma, jossa luot kaksi Ajoneuvo-muuttujaa (ei siis Auto- tai
Lentokone-tyyppisiä), ja sijoitat niihin Auto-olion ja Lentokone-olion.
Kutsu kummankin olion liiku()-metodia.
Lisää Auto-luokkaan attribuutti int ajokilometrit. Lisää
Lentokone-luokkaan attribuutti int lentotunnit. Lisää kummallekin luokalle
uusi konstruktori, jossa nämä attribuutit asetetaan. Muokkaa aiempaa
konstruktoria niin, että nämä attribuutit saavat arvon 0.
Muuta liiku()-metodeja siten, että ne kasvattavat näitä arvoja. Auto-luokan
liiku()-metodi kasvattaa ajokilometrit-attribuuttia 10:llä ja
Lentokone-luokan liiku()-metodi kasvattaa lentotunnit-attribuuttia 1:llä.
Ylikirjoita vielä Ajoneuvo-luokassa metodi toString(), joka palauttaa
tekstin "Ajoneuvon <merkki> tiedot: ". Ylikirjoita tämä metodi edelleen
Auto- ja Lentokone-luokissa siten, että ne palauttavat lisäksi
ajokilometrit tai lentotunnit.
Tee abstrakti luokka Viesti, jolla on attribuutti String viesti, joka
asetetaan konstruktorissa. Aseta viesti-attribuutin näkyvyys mahdollisimman
rajoitetuksi. Luokalla on myös abstrakti metodi void laheta().
Peri Viesti-luokasta luokat Sahkoposti ja Tekstiviesti. Molemmissa luokissa on
konstruktori, joka kutsuu yliluokan konstruktoria. Toteuta molempiin luokkiin
laheta()-metodit. Sahkoposti-luokan laheta()-metodi tulostaa muodossa
"Lähetetään sähköposti: <viesti>" ja Tekstiviesti-luokan laheta()-metodi
tulostaa muodossa `"Lähetetään tekstiviesti: <viesti>"
Muuta Tehtävän 3.6 Ajoneuvo-luokka ja sen liiku()-metodi abstrakteiksi. Jätä
toString()-metodi edelleen tavalliseksi (ei-abstraktiksi) metodiksi.
-
Tee abstrakti luokka
Viestikanava. Sillä on attribuuttiString vastaanottaja, joka asetetaan konstruktorissa. Lisää abstrakti metodilahetaSisaisesti(String viesti), joka ei palauta mitään. -
Tee myös metodi
String getVastaanottaja(), joka palauttaa vastaanottajan. -
Tee konkreettinen metodi
laheta(String viesti), joka aluksi lopettaa metodin (return), jos viesti on tyhjä tainull. Muuten metodi kutsuu abstraktia metodialahetaSisaisesti(String viesti). -
Peri
Viestikanava-luokastaSahkopostijaTekstiviesti. Molemmissa luokissa ylikirjoita abstrakti metodilahetaSisaisesti(String viesti), joka tulostaa konsoliin viestin muodossa "Lähetetään <kanava> <osoite/numero>: <viesti>", esim. "Lähetetään sähköposti osoitteeseen antti-jussi@lakanen.com: Hei, mikä on homma?" tai "Lähetetään tekstiviesti numeroon 0401234567: Tervetuloa kurssille!".
Tee Viestipalvelu-luokka, jolle voi lisätä erilaisia Viestikanava-olioita
lisaaKanava(Viestikanava kanava)-metodilla. Lisää myös metodi
lahetaKaikille(String viesti), joka lähettää viestejä kaikilla kanavilla
kerralla.
Pari valinnaista lisähaastetta (ei pisteitä; nämä ovat kuitenkin mallivastauksessa mukana):
- Muuta
Viestikanava-luokkaa siten, että se ottaa listan vastaanottajia, ei vain yhtä. Tämän seurauksena pitää muuttaa myöslahetaSisaisesti-metodeja. - Laita
Tekstiviesti-luokkaan merkkiraja (esim. 80 merkkiä). Jos viesti on tätä pidempi, niin viesti tulee pilkkoa merkkirajan mukaisiin pätkiin.