YHTEYSSUHDE (assosiation) -Mikä on yhteyssuhde? -Miten toteutan yhteyssuhteen? 1
Mikä on yhteyssuhde? Yhteyssuhde kuvaa kahden olion välistä suhdetta: Esim. Auto Henkilö, omistussuhde Tili Asiakas, omistussuhde Tilaus Asiakas, tilaaja Lainaus Asiakas, lainaaja 2
Mikä on yhteyssuhde? Luokkakaaviossa kuvataan Tilin ja Asiakkaan suhde: Tili - numero : String - saldo : double * 1 Asiakas numero etunimi sukunimi Tilin ja Asiakkaan välillä on yhteyssuhde, tässä ns. omistussuhde Tilin omistaa täsmälleen yksi asiakas Yksi asiakas voi omistaa useita tilejä 3
Miten yhteyssuhde toteutetaan? Relaatiomaailmassa laitamme viiteavaimen siihen relaatioon jolla on nollaan tai yhteen toiseen relaatioon yksilöön yhteys: Relaatiokaavat: ASIAKAS (numero (PK), etunimi, sukunimi ) TILI (numero (PK), saldo, asiakasnro (FK) ),missä PK on pääavain ja FK on viiteavain Oliomaailmassa Tili-luokkaan lisätään attribuutti, joka on viittaus olioon Asiakas public class Tili { // attribuutit private String numero; private double saldo; private Asiakas omistaja; // tilin omistaja 4
Oletusmuodostin Tili-luokan oletusmuodostin: public Tili() { numero = null; saldo = 0.0; omistaja = null; // omistajaa ei vielä tiedetä Kun luomme Tili olion Tili tili = new Tili (); tili: numero:null saldo : 0.0 omistaja: null 5
Parametrillinen muodostin Tili-luokan parametrillinen muodostin: public Tili(String numero, double saldo, Asiakas asiakas) { this.numero = numero; this.saldo = saldo; omistaja = asiakas; // sijoitetaan omistajaksi annettu asiakas Asiakas asiakas = new Asiakas (100, Elli, Ollila ); asiakas: numero = 100 etunimi = Elli sukunimi = Ollila Tili tili = new Tili ( Fi0112, 100, asiakas); tili: numero= Fi0112 saldo = 100 omistaja: 6
Olion tuhoutuminen Kummatkin yhteyssuhteessa olevat oliot elävät omaa maailmaansa Kun Tili-olio tuhoutuu, Asiakas-olio jatkaa elämäänsä eli ei ole sidoksissa Tiliin Esim. Asiakas asiakas = new Asiakas (100, "Elli", "Ollila"); Tili tili = new Tili ( "Fi01221", 100, asiakas); System.out.println(tili.toString()); tulostuu: numero=fi01221, saldo=100.0 100: Elli Ollila tili = null; System.out.println(asiakas.getEtunimi() + " " + asiakas.getsukunimi() + ": " + asiakas.getnumero()); tulostuu: Elli Ollila: 100 7
set-metodi public class Tili { private Asiakas omistaja; // tilin omistaja public void setomistaja(asiakas omistaja) { this.omistaja = omistaja; Esim. Asiakas asiakas = new Asiakas (100, "Elli", "Ollila"); Tili tili = new Tili(); tili.setomistaja(asiakas); 8
Get-metodi public class Tili { private Asiakas omistaja; // tilin omistaja.. public Asiakas getomistaja() { return omistaja; Tili tili = new Tili(); Asiakas omistaja = tili.getomistaja(); 9
tostring-metodi public class Tili { private String numero; private double saldo; private Asiakas omistaja; // tilin omistaja public String tostring() { String paluu = "numero=" + numero + ", saldo=" + saldo ; if (omistaja!= null) { paluu = paluu + return paluu; "\nomistaja=" + omistaja.tostring(); 10
Pääohjelma public class TiliAsiakasOhjelma { private Scanner input; TiliAsiakasOhjelma(){ input = new Scanner(System.in); public void aja(){ int nro; String etunimi, sukunimi; String numero; double saldo; System.out.print("Anna asiakkaan numero: "); nro = input.nextint(); System.out.print("Anna asiakkaan etunimi sukunimi: "); etunimi = input.next(); sukunimi = input.next(); Asiakas asiakas = new Asiakas (nro, etunimi, sukunimi); 11
Pääohjelma jatkuu System.out.print("Anna tilin numero: "); numero = input.next(); System.out.print("Anna tilin saldo: "); saldo = input.nextdouble(); Tili tili = new Tili(numero, saldo, null); System.out.print("anna tilin omistajan numero: "); nro = input.nextint(); if (nro == asiakas.getnumero()) { tili.setomistaja(asiakas); System.out.println(tili.toString()); Toteutus: Anna asiakkaan numero: 10234 Anna asiakkaan etunimi sukunimi: Olli Oja Anna tilin numero: FI010101 Anna tilin saldo: 1232 Anna tilin omistajan numero: 10234 numero=fi010101,saldo=1232.0 omistaja: 10234 Olli Oja public static void main (String [] args){ TiliAsiakasOhjelma ohj = new TiliAsiakasOhjelma(); ohj.aja(); 12
Harjoitus Toteuta alla olevassa kuvassa olevat luokat. Asukkaalla on seuraavat attribuutit: numero, etunimi, sukunimi ja katuosoite sekä yhteyssuhde Postiluokan olioon, mikä kertoo postialueen, missä asukas asuu. Posti-luokalla on attribuutit: postinro, postitmp. Tee luokille kaikki muodostimet, set- ja getattribuutti-metodit sekä tostringmetodi. Asukas -numero -etunimi -sukunimi -katuosoite * 1 Posti -postinro -postitmp 13
Harjoitus jatkuu Tee ohjelmaluokka AsukasOhjelma, joka luo kaksi Asukas-oliota, jotka käyttävät samaa Postia. Ohjelma tulostaa seuraavaa käyttäen em. luokkia: Asukkaat: 1234567 Martta Lahtinen Lainkaarentie 3 00670 HELSINKI 1234568 Vilho Laaksonen Vihtorintie 34 B 00670 HELSINKI 14
ratkaisu public class Posti { private String postinro; private String postitmp; public Posti(){ postinro = postitmp = null; public Posti (String nro, String tmp){ postinro = nro; postitmp = tmp; if (postitmp!= null) postitmp = postitmp.touppercase(); public String getpostinro() { return postinro; public void setpostinro(string nro) { postinro = nro; public String getpostitmp() { return postitmp; public void setpostitmp(string tmp) { this.postitmp = tmp; if (postitmp!= null) postitmp = postitmp.touppercase(); public String tostring () { return postinro + " " + postitmp; 15
Ratkaisu jatkuu.. public class Asukas { private int asnumero; private String etunimi; private String sukunimi; private String katuosoite; private Posti posti; // yhteyssuhde Postiin public Asukas () { posti = null; asnumero = 0; etunimi = sukunimi = katuosoite = null; public Asukas (int nro, String etu, String suku, String katu, Posti posti) { asnumero = nro; etunimi = etu; sukunimi = suku; katuosoite = katu; this.posti = posti; public int getasnumero() { return asnumero; public String getetunimi() { return etunimi; public String getsukunimi() { return sukunimi; public String getkatuosoite() { return katuosoite; public Posti getposti() { return posti; 16
Ratkaisu jatkuu.. public void setasnumero(int asnumero) { this.asnumero = asnumero; public void setetunimi(string etunimi) { this.etunimi = etunimi; public void setsukunimi(string sukunimi) { this.sukunimi = sukunimi; public void setkatuosoite(string katuosoite) { this.katuosoite = katuosoite; public void setposti(posti posti) { this.posti = posti; public String tostring (){ return asnumero + " " + etunimi + " " + sukunimi + "\n" + katuosoite + "\n" + posti; // jos posti!= null kutsutaan automaattisesti posti.string() metodia 17
Ratkaisu jatkuu.. public class AsukasOhjelma { public static void main(string[] args) { Posti posti = new Posti ("00670", "Helsinki"); Asukas as1 = new Asukas (1234567, "Martta", "Lahtinen", "Lainkaarentie 3", posti); Asukas as2 = new Asukas(1234568, "Vilho", "Laaksonen", "Vihtorintie 34 B", posti); System.out.println( Asukkaat:\n"); System.out.println(as1); System.out.println("\n" + as2); 18