Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.

Tehtävä 3.1: Luokkahierarkia, osa 1. 1 p.

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.

Tee tehtävä TIMissä
Tehtävä 3.2: Luokkahierarkia, osa 2. 1 p.

Jatketaan edellistä tehtävää. Peri Tuote-luokasta myös luokka Elektroniikka.

Lisää erityispiirteitä kuhunkin aliluokkaan:

  • Vaate: attribuutti String koko (esim. "M", "L", jne.), metodi void sovita(String sovittajanKoko), joka tulostaa, onko vaate sopiva sovittajalle.
  • Elektroniikka: attribuutti int takuuKuukausina (esim. 24), metodi int takuutaJaljella(int kuukausiaKulunut) palauttaa montako kuukautta takuuta on jäljellä (tai 0, jos takuu on umpeutunut).
  • Ruoka: attribuutti String parastaEnnen (esim. "31.01.2026"), ja metodi void syo(), joka tulostaa "Nautit ruoan, jonka viimeinen käyttöpäivä on DD.MM.YYYY." (korvaa DD.MM.YYYY parastaEnnen-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.

Tee tehtävä TIMissä
Tehtävä 3.3: Luokkahierarkia, osa 3. 1 p.

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.

  1. Puhelin (perii Elektroniikka)

    • 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 0401122330
      • public 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).
  2. Pakaste (perii Ruoka)

    • 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.

Tee tehtävä TIMissä
Bonus: Tehtävä 3.4: Luokkahierarkia, osa 4. 1 p.

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)
  • metodit
    • lataa(), joka heikentää akun kuntoa 0.1%:lla jokaisella latauskerralla.
    • toString(), joka kutsuu ensin yliluokan metodia toSTring(), jonka jälkeen tulostaa akun kunnon prosentteina ja sitten toimintasäteen kilometreinä, jonka laskemiseen hyödynnetään kaavaa: (akunkunto / 100 * TOIMINTASADE_MAX).

Tee tehtävä TIMissä
Tehtävä 3.5: Korvaaminen, osa 1. 1 p.

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.

Tee tehtävä TIMissä
Tehtävä 3.6: Korvaaminen, osa 2. 1 p.

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 tehtävä TIMissä
Tehtävä 3.7: Viestit. 1 p.

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>"

Tee tehtävä TIMissä
Tehtävä 3.8: Abstrakti ajoneuvo. 1 p.

Muuta Tehtävän 3.6 Ajoneuvo-luokka ja sen liiku()-metodi abstrakteiksi. Jätä toString()-metodi edelleen tavalliseksi (ei-abstraktiksi) metodiksi.

Tee tehtävä TIMissä
Tehtävä 3.9: Viestikanavat. 1 p.
  1. Tee abstrakti luokka Viestikanava. Sillä on attribuutti String vastaanottaja, joka asetetaan konstruktorissa. Lisää abstrakti metodi lahetaSisaisesti(String viesti), joka ei palauta mitään.

  2. Tee myös metodi String getVastaanottaja(), joka palauttaa vastaanottajan.

  3. Tee konkreettinen metodi laheta(String viesti), joka aluksi lopettaa metodin (return), jos viesti on tyhjä tai null. Muuten metodi kutsuu abstraktia metodia lahetaSisaisesti(String viesti).

  4. Peri Viestikanava-luokasta Sahkoposti ja Tekstiviesti. Molemmissa luokissa ylikirjoita abstrakti metodi lahetaSisaisesti(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 tehtävä TIMissä
Tehtävä 3.10: Viestipalvelu. 1 p.

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):

  1. Muuta Viestikanava-luokkaa siten, että se ottaa listan vastaanottajia, ei vain yhtä. Tämän seurauksena pitää muuttaa myös lahetaSisaisesti-metodeja.
  2. Laita Tekstiviesti-luokkaan merkkiraja (esim. 80 merkkiä). Jos viesti on tätä pidempi, niin viesti tulee pilkkoa merkkirajan mukaisiin pätkiin.
Tee tehtävä TIMissä