Vahva koostumussuhde (Composition)

Samankaltaiset tiedostot
Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

YHTEYSSUHDE (assosiation)

Mikä yhteyssuhde on?

Olio-ohjelmointi Javalla

UML ja luokkien väliset suhteet

Periytyminen (inheritance)

Listarakenne (ArrayList-luokka)

Luokan sisällä on lista

public static void main (String [] args)

Metodien tekeminen Javalla

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Lista luokan sisällä

Rajapinta (interface)

Luokan muodostimet (Constructors)

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

KOHDELUOKAN MÄÄRITTELY

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Poikkeustenkäsittely

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

TyontekijaOhjelma. +main() (käyttää) + = public - = private

Taulukoiden käsittely Javalla

Metodien tekeminen Javalla

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

1 Tehtävän kuvaus ja analysointi

Java-kielen perusteita

Tietokannat II -kurssin harjoitustyö

Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

UML -mallinnus LUOKKAKAAVIO EERO NOUSIAINEN

Ehto- ja toistolauseet

14. Poikkeukset 14.1

Ohjelmointi 2, välikoe

14. Poikkeukset 14.1

Kooste. Esim. Ympyrän keskipiste voidaan ajatella ympyrän osaksi.

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmoinnin perusteet, kurssikoe

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

7. Oliot ja viitteet 7.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Ohjelmistotekniikan menetelmät, koe

Ohjelmointityö 3. Mikko Laamanen

Java kahdessa tunnissa. Jyry Suvilehto

8. Näppäimistöltä lukeminen 8.1

Luokat ja oliot. Ville Sundberg

Java-kielen perusteet

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Oliot viestivät metodeja kutsuen

2. Olio-ohjelmoinista lyhyesti 2.1

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Yksikkötestaus. Kattava testaus. Moduulitestaus. Ohjelman testaus. yksikkotestaus/ Seija Lahtinen

Javan perusteita. Janne Käki

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Ohjelmointi 2 / 2011 Välikoe / 25.3

Mitä poikkeuskäsittely tarkoittaa?

Java-kielen perusteita

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Ohjelmointi 2 / 2010 Välikoe / 26.3

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin

1. Mitä tehdään ensiksi?

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

8. Näppäimistöltä lukeminen 8.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Rinnakkaisohjelmointi, Syksy 2006

Luokkakirjastot. esiintymämetodien käytöstä:

Java ja grafiikka. Ville Sundberg

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Standardi- ja tietorakenneluokkia

12. Näppäimistöltä lukeminen 12.1

Javan GUI Scratchaajalle

16. Javan omat luokat 16.1

4. Luokan testaus ja käyttö olion kautta 4.1

19. Olio-ohjelmointia Javalla 19.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Olioiden yhteistoiminta

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

Osion kaksi kertaus. Jukka Juslin. Jukka Juslin

Sisältö. 2. Taulukot. Yleistä. Yleistä

Sisältö. 22. Taulukot. Yleistä. Yleistä

Ohjelmistojen mallintaminen, syksy 2011, laskuharjoitus 2

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

4. Olio-ohjelmoinista lyhyesti 4.1

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

TIETORAKENTEET JA ALGORITMIT

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

1. Omat operaatiot 1.1

Transkriptio:

Vahva koostumussuhde (Composition) - Mitä vahva koostumsusuhde tarkoittaa? - Vahva koostumussuhde vs. yhteyssuhde - Miten toteutan vahvan koostumussuhteen? - Muodostimet - Set ja get-metodit - tostring-metodi 1

Aito/Vahva koostumussuhde (composition) Tarkoittaa koostumussuhdetta, jossa osaolio riippuu isäntäoliostaan kahdella tavalla: Osa ei ole olemassa ilman isäntää Osa voi olla vain yhden isännän osa isännän tulee huolehtia osan luomisesta ja tuhoamisesta Tili -numero -saldo 1 1 Käyttöraja -verkkoraja -nostoraja osaluokka Tili-olio luo oman Käyttöraja-olionsa ja kun Tili-olio tuhoutuu, myös Käyttöraja-olio tuhoutuu 2

Aito/Vahva koostumussuhde (composition) jatkuu Tili-luokan konstruktori luo itselleen Kayttoraja-luokan olion Tili-luokan set-metodilla muutetaan Tilin kayttoraja-olion attribuutteja Tili-luokan get-metodilla palautetaan kopio kayttorajasta Tili-luokasta Kayttoraja-luokan oliota käytetään Kayttorajaluokan metodeilla Kun Tili-luokan olio tuhotaan, samalla tuhoutuu myös Tililuokan sisässä oleva Kayttoraja-luokan olio 3

Vahva koostumussuhde vs. yhteyssuhde Vahva koostumussuhde - oliolla on oma ns. osaolio - olio luo itse osaolion - Yhteyssuhde - oliolla on suhde toiseen olioon - molemman oliot syntyvät itsenäisesti Tili tili = new Tili(); tili: koosteolio osaolio numero: null saldo: 0.00 kayttoraja: Verkkoraja: 1000 Nostoraja:1000 Tili tili = new Tili(); Asiakas asiakas = new Asiakas(); tili.setomistaja(asiakas); 4

Miten toteutan vahvan koostumussuhteen? public class Tili { private String numero; private double saldo; private Kayttoraja kayttoraja; public class Kayttoraja { private double verkkoraja; private double nostoraja; tili-luokassa viittaus Kayttoraja-olioon public Kayttoraja() { verkkoraja = 1000.0; nostoraja = 1000.0; public Kayttoraja(double verkkoraja, double nostoraja) { this.verkkoraja = verkkoraja; this.nostoraja = nostoraja; 5

Muodostimet Tili-luokassa luodaan jokaisessa muodostimessa Kayttoraja-olio public class Tili { private Kayttoraja kayttoraja; public Tili() { kayttoraja = new Kayttoraja(); public Tili(String numero, double saldo) { this.kayttoraja = new Kayttoraja(); // luo olio Jatkuu 6

Muodostimet jatkuu.. Tili tili = new Tili(); tili: numero: null saldo: 0.00 kayttoraja: Tili-olio luo muodostimissaan Kayttoraja-olion oletusmuodostimella verkkoraja: 1000.0 nostoraja: 1000.0 7

Muodostimet jatkuu Tili-luokan parametrillisessa muodostimessa, jossa parametrina on kayttoraja-olio, luodaan oma Kayttoraja-olio ja viedään sille parametrina olevan olion attribuuttien arvot public Tili(String numero, double saldo, Kayttoraja kayttoraja) { this.kayttoraja = new Kayttoraja(); // luo olio if (kayttoraja!= null){ // vie oliolle parametrin tiedot this.kayttoraja.setnostoraja(kayttoraja.getnostoraja()); this.kayttoraja.setverkkoraja(kayttoraja.getverkkoraja()); 8

Muodostimet jatkuu Esim. Kayttoraja kayttoraja = new Kayttoraja (1200.0, 500.0 ); Tili tili = new Tili ( Fi0101, 200.0, kayttoraja); tili: numero: Fi0101 saldo: 200.00 kayttoraja: verkkoraja: 1200.0 nostoraja: 500.0 9

Set-metodi public class Tili { private Kayttoraja kayttoraja; public void setkayttoraja(kayttoraja kayttoraja) { // päivitä prarametrin tiedoilla kayttoraja-olion // attribuutit if (kayttoraja!= null) { this.kayttoraja.setverkkoraja(kayttoraja.getverkkoraja()); this.kayttoraja.setnostoraja( kayttoraja.getnostoraja()); Kutsu: Tili tili = new Tili(); Kayttoraja raja = new Kayttoraja ( 1200.0, 500.0 ); tili.setkayttoraja(raja); 10

Get-metodi get-metodi palauttaa kopion Kayttoraja-oliosta public class Tili { private Kayttoraja kayttoraja; public Kayttoraja getkayttoraja() { // palauta Kayttoraja-olion kopio Kayttoraja kopio = new Kayttoraja (kayttoraja.getverkkoraja(), kayttoraja.getnostoraja()); return kopio; 11

tostring-metodi public class Tili { private Kayttoraja kayttoraja; public String tostring() { return "numero=" + numero + ", saldo=" + saldo + ", käyttöraja= + kayttoraja.tostring(); Kutsu: Tili tili = new Tili(); System.out.println("Tilin tiedot:\n" + tili.tostring()); Kayttoraja raja = tili.getkayttoraja(); System.out.println("Verkossa: " + raja.getverkkoraja() + "\nnostossa: " + raja.getnostoraja()); 12

Pääohjelma public static void main(string[] args) { Scanner input = new Scanner(System.in); Tili tili = new Tili("FI010101", 1000.50); System.out.print("Anna verkkoraja: "); double verkkoraja = input.nextdouble(); System.out.print("Anna nostoraja: "); double nostoraja = input.nextdouble(); // luo Kayttoraja-olio Kayttoraja kayttoraja = new Kayttoraja(verkkoraja, nostoraja); tili.setkayttoraja(kayttoraja); // vie kayttoraja tilille System.out.println("Tilin tiedot:\n" + tili.tostring()); 13

Harjoitus Tee Oppilas-luokka, jonka attribuutit ovat oppilasnro, etunimi, sukunimi, ja syntpvm, jonka toteutat Date-luokan avulla vahvana koostumussuhteena. Oppilas oppilasnro etunimi sukunimi syntpvm Date Tee ohjelma-luokka OppilasOhjelma, joka luo kaksi oppilas oliota ja pyytää käyttäjältä kummallekin syntymäpäivämäärän. 14

ratkaisu public class Oppilas { // attribuutit private int oppilasnro; private String etunimi; private String sukunimi; private Date syntpvm; // vahva koostumissuhde, kompositio // oletusmuodostin/parametriton konstruktio public Oppilas(){ oppilasnro=0; etunimi=sukunimi = null; syntpvm = new Date(); oppilas oliolla on aina Date-olio,johon syntpvm viittaa 15

Ratkaisu jatkuu.. // parametrillinen muodostin eli konstruktori public Oppilas (int nro, String etu, String suku){ oppilasnro= nro; etunimi = etu; sukunimi = suku; syntpvm = new Date(); // 2. parametrillinen muodostin public Oppilas (int nro, String etu, String suku, Date pvm){ oppilasnro = nro; etunimi = etu; sukunimi = suku; if (pvm!= null){ this.syntpvm = (Date)pvm.clone(); // kopioi pvm-olio else syntpvm = new Date(); 16

Ratkaisu jatkuu.. public int getoppilasnro(){ return oppilasnro; public String getnimi(){ return etunimi + " " + sukunimi; // palauttaa kopion syntpvm-oliosta public Date getsyntpvm(){ Date kopio = null; kopio = (Date) syntpvm.clone(); // kopioi syntpvm return kopio; 17

Ratkaisu jatkuu.. public void setoppilasnro(int nro){ oppilasnro = nro; public void setetunimi(string etu){ etunimi = etu; public void setsukunimi(string suku){ sukunimi = suku; public void setsyntpvm ( Date pvm ){ if (pvm!= null){ syntpvm = (Date)pvm.clone(); // kopioi pvm 18

Ratkaisu jatkuu.. public String tostring(){ SimpleDateFormat fdate = new SimpleDateFormat("dd.MM.yyyy"); String paluu; paluu = oppilasnro + " " + etunimi + " " + sukunimi + " " + fdate.format(syntpvm); return paluu; 19

Ratkaisu jatkuu.. public class OppilasOhjelma { private Scanner input; public OppilasOhjelma(){ input = new Scanner(System.in); public static void main(string[] args) { OppilasOhjelma o = new OppilasOhjelma(); o.aja(); 20

Ratkaisu jatkuu.. public void aja() { Oppilas oppilas = new Oppilas(); System.out.println(oppilas.toString()); Oppilas oppilas2 = new Oppilas(100,"Taisto", "Tammi"); Date pvm = pyydapvm("taisto Tammi"); oppilas2.setsyntpvm(pvm); System.out.println(oppilas2.toString()); Oppilas oppilas3 = new Oppilas(200,"Pirkko", "Mannola"); pvm= pyydapvm("pirkko Mannola"); oppilas3.setsyntpvm(pvm); System.out.print(oppilas3.getOppilasnro() + " " + oppilas3.getnimi() + " "); SimpleDateFormat f = new SimpleDateFormat("dd.MM.yyyy"); pvm = oppilas3.getsyntpvm(); System.out.println(f.format(pvm)); 21

Ratkaisu jatkuu.. private Date pyydapvm (String nimi){ Date pvm = null; String pvmstr; SimpleDateFormat f = new SimpleDateFormat("dd.MM.yyyy"); do { // pyydetään pvm kunnes käyttäjä antaa kunnollisen System.out.print("Anna opiskelijan " + nimi + " syntymäpävämäärä muodosssa pp.kk.vvvvv: "); pvmstr= input.next(); try { pvm = f.parse(pvmstr); // muuta pvmstr date-olioksi catch (ParseException e){ System.out.println("antamasi pvm on virheellinen!"); pvm = null; while (pvm == null); return pvm; 22

toteutus Miten ohjelma toimii: 0 null null 14.03.2016 Anna opiskelijan Taito Tammi syntymäpäivämäärä muodossa pp.kk.vvvv: 13-5-1967 Antamasi pvm on virheellinen! Anna opiskelijan Taito Tammi syntymäpäivämäärä muodossa pp.kk.vvvv: 13.5.1947 Anna opiskelijan Pirkko Mannola syntymäpäivämäärä muodossa pp.kk.vvvv: kolmesataa Antamasi pvm on virheellinen! Anna opiskelijan Pirkko Mannola syntymäpäivämäärä m muodossa pp.kk.vvvv: 1.1.1956 200 Pirkko Mannola 01.01.1956 23