OOMPA 1999 Frelsning 3 Objektorienterad Modellering Programmering och
OOMPA 1999 Föreläsning 3 Objektorienterad Modellering Programmering och Analys Objektorientering grunder-2 l Komponenter och beteende l Java introduktion och översikt – kort historik – Javas arkitektur – klass, metod, attribut – något om virtuell maskin, klasser, filer och kompilering
En komponent l En komponent karaktäriseras genom sitt beteende – Dvs vad kan den göra l En komponent brukar delas upp i: – Beteende l l Vad kan komponenten göra Protokoll – Tillstånd l l © Björn Eiderbäck 1999 Vilken information är knuten till komponenten Informationen kan ändras över tiden -2 -
Dela upp på delkomponenter l Identifiera vad som skall göras och sedan vem som skall göra det l Då man börjar få någorlunda klart för sig vad man skall konstruera är det dags att identifiera komponenter l Komponenterna (systemen) delas sedan upp på delkomponenter (delsystem) l Detta är ofta en brainstormingliknande iterativ process © Björn Eiderbäck 1999 -3 -
Tumregler l En komponent skall ha en liten mängd väldefinierat och meningsfullt ansvar – Ändringar skall påverka så få som möjligt l l Om detta uppfylls brukar man tala om en hög kohesion (eng. cohesion) En komponent skall interagera så lite som möjligt med andra komponenter – Att minska kopplingen (eng. coupling) mellan olika komponenter ökar sannolikheten för att ändringar kan göras med minimal inverkan på andra komponenter © Björn Eiderbäck 1999 -4 -
Parnas principer l Utvecklaren av en mjukvarukomponent måste erbjuda den tänkta användaren med all information som behövs, men ingen annan, för att effektivt använda den erbjudna servicen l Utvecklaren av en mjukvarukomponent måste erbjudas all nödvändig information, men ingen annan, för att kunna utföra komponentens tilldelade ansvar © Björn Eiderbäck 1999 -5 -
Java l Java är konstruerat på SUN – Första versionen släpptes 1995 l Starkt typat – Dvs det går att avgöra typkompatibilitet av alla uttryck i programmet vid kompileringstillfället. l Virtuell maskin (VM) som gör det maskinoberoende – En speciell VM per plattformstyp överbryggar olikheter i plattformarnas arkitektur l Klassbibliotek – språkklasser, stränghantering, grafik, gränssnitt, fönster, Internet, händelsehantering, processer, collections, mm l Bindning till WWW – med applets och liknande Har fått sin huvudsakliga spridning via Internet l Syntax som C. Semantik och klasser mer som Smalltalk l © Björn Eiderbäck 1999 -6 -
Virtuell maskin källkod kompilera (javac) java bytekod kör (java) en virtuell maskin per plattformstyp © Björn Eiderbäck 1999 Mac VM Pc VM -7 - Unix VM
Java: mitt första "program" l Skapa en fil med namnet My. First. Program. java l Skriv följande kod i filen: import java. io. *; public class My. First. Program{ public static void main (String [] args) { System. out. println("Mitt första program!"); } } © Björn Eiderbäck 1999 -8 -
. . . kompilera och kör l Kompilera >javac My. First. Program. java l Då genereras en körbar fil My. First. Program. class l Kör genom att starta Javas virtuella maskin med program/klassnamnet som argument >java My. First. Program Mitt första program! Regeln är att klassens static void main-metod alltid exekveras -9© Björn Eiderbäck 1999 l
Ett "Javaprograms" struktur En klass ser ut på följande sätt public class Klass. Namn extends Super. Klass. Namn{ attribut (instans- och klassvariabler) Kallas också för metoder (instans- och klassmetoder) medlemmar konstruktörer } l • En metod modifierare returtyp funktionsnamn(argument){ programsatser } © Björn Eiderbäck 1999 - 10 -
Konstruera klass l Klassnamn = filnamn – En klass skall ha samma namn som den fil den placeras i l Klassen Circle i filen Circle. java l En fil kan innehålla flera klasser men bara en av dem kan vara deklarerad public, – Det är den publika klassens namn som motsvarar filens l Definition av klass, mall public class Klass. Namn extends Super. Klass. Namn{ attribut (instans- och klassvariabler) metoder (instans- och klassmetoder) konstruktörer } © Björn Eiderbäck 1999 - 11 -
Deklarera och instansiera l Deklaration av instans Klass. Namn variabel. Namn; l Instansiering variabel. Namn = new Klass. Namn(); alternativt, både deklaration och instansiering på en gång Klass. Namn variabel. Namn = new Klass. Namn(); © Björn Eiderbäck 1999 - 12 -
Kompilera och köra l Environmentvariabel – Gör först (NADA) module add java Ger idag (990907) jdk-1. 1. 6 För jdk-1. 2 (rekommenderas om du inte skall göra appletar) skriv istället: module add jdk/latest – Hemma bör du explicit sätta path (se systemdokumentation) l Kompilera med javac filnamn javac Klassnamn. java – om allt går bra skapas då en fil med namnet Klassnamn. class l Kör med java klassnamn java Klassnamn © Björn Eiderbäck 1999 - 13 -
Typer l I Java måste alla variabler och metoder deklareras med typ Typ variabel; l Det finns primitiva typer som int, char, float och boolean int x; l En variabel kan ges ett initialt värde vid deklarationen int x = 10; l Man kan också använda typer som är implementerade som vanliga klasser String course = "OOMPA-99"; © Björn Eiderbäck 1999 - 14 -
Modifierare l En modifierare kan användas för att ange vilka objekt som kan accessa en klass eller dess medlemmar (dvs dess attribut eller metoder), mest grundläggande är: static l indikerar att medlemmen är klassvariabel eller klassmetod public l medlemmen är accessbar överallt där dess klass är accessbar protected l medlemmen endast accessbar i klassen, dess subklasser eller i aktuellt package (vi återkommer till package vid senare tillfälle) private l © Björn Eiderbäck 1999 medlemmen endast accessbar i den klass som definierar den - 15 -
Exempel import java. io. *; public class Bank. Account{ protected int balance = 0; public void deposit (int amount) { balance = balance + amount; } public void withdraw (int amount) { balance = balance - amount; } public int balance (){ return balance; } } © Björn Eiderbäck 1999 - 16 -
. . . Bank. Account account 1, account 2; int transfer; account 1 = new Bank. Account(); account 2 = new Bank. Account(); account 1. deposit(200); account 2. deposit(100); transfer = 75; account 1. withdraw(transfer); account 2. deposit(transfer); account 2. balance(); // resultat 175 © Björn Eiderbäck 1999 - 17 -
På NADA l Då du kör på någon av NADAS datorer bör du först göra: module add java – Då ändras din PATH så att du direkt kan komma åt Java-kompilatorn och standardbiblioteken © Björn Eiderbäck 1999 - 18 -
Sammanfattning: Konstruera klass l Klassnamn = filnamn – En klass skall ha samma namn som den fil den placeras i l l Klassen Circle i filen Circle. java En fil kan innehålla flera klasser men bara en av dem kan vara deklarerad public, – Det är den publika klassens namn som motsvarar filens l Definition av klass, mall public class Klass. Namn extends Super. Klass. Namn{ attribut (instans- och klassvariabler) metoder (instans- och klassmetoder) konstruktörer } © Björn Eiderbäck 1999 - 19 -
Sammanfattning: Deklarera och instansiera l Deklaration av instans Klass. Namn variabel. Namn; l Instansiering variabel. Namn = new Klass. Namn(); alternativt, både deklaration och instansiering på en gång Klass. Namn variabel. Namn = new Klass. Namn(); © Björn Eiderbäck 1999 - 20 -
Sammanfattning: Kompilera och köra l Environmentvariabel – Gör först (NADA) module add java – Hemma bör du explicit sätta path (se systemdokumentation) – Om du har en egen java-katalog kan det vara idé att sätta environmentvariabeln CLASSPATH l l setenv CLASSPATH $HOME/My. JAVA: . Kompilera med javac filnamn javac Klassnamn. java – om allt går bra skapas då en fil med namnet Klassnamn. class l Kör med java klassnamn java Klassnamn © Björn Eiderbäck 1999 - 21 -
Exempel: Klass Circle // Klassdefinition (utan extends medför subklass till Object) public class Circle {public double x, y; public double r; public double circumference(){return 2 * 3. 14 * r; } public double area(){return 3. 14 * r; } // för att testa det hela skriver vi en static main-metod public static void main (String args[]) { //Vi deklarerar en temporär variabel Circle circle; // och instansierar circle = new Circle(); © Björn Eiderbäck 1999 - 22 -
. . . forts. . . //vi ändrar några värden circle. x = 100; circle. y = 200; circle. r = 20; // vi gör några testutskrifter System. out. println("Cirkelns x-koordinat: " + circle. x + " och dess y-koordinat: " + circle. y); System. out. println("den har en radie också: " + circle. r); System. out. println( "metoden circumference ger omkretsen: " + circle. circumference()); System. out. println("och med area: " + circle. area() + " dess area"); } } © Björn Eiderbäck 1999 - 23 -
. . . och så sparar vi, kompilerar och kör l Spara – Spara filen med samma namn som klassen med extension. java, dvs här Circle. java l Kompilera javac Circle. java – Skapar en fil Circle. class l Kör java Circle © Björn Eiderbäck 1999 - 24 -
Exempel: Eka argument l Skapa fil Echo. java (som ekar argumenten vid exekveringen) forloopar ser ut som i ANSI-C l public class Echo { public static void main(String argv[]) { for(int i = 0; i < argv. length; i++) System. out. print(argv[i] + " "); System. out. print("n"); System. exit(0); } } Kompilera javac Echo. java l Kör java Echo detta är input © Björn Eiderbäck 1999 - 25 -
In- och utmatning l Textutmatning sker via klassen System. out. println(. . . ); – Där: l l l System är en klass i java. lang out är en klassvariabel i System out är en instans av klassen Print. Stream har en instansmetod println som skriver ut text på terminalen Textinmatning sker också via klassen System char c = System. in. read() – Inmatningen måste dock ”fånga” undantag try{char c = System. in. read()} catch(IOException e){//fel har inträffat} © Björn Eiderbäck 1999 - 26 -
Exempel: ”program” med teckeninmatning package Tests; import java. io. *; class Test. IO_1_1 { public static void main(String [] args) {for(; ; ){int in; try {in = System. in. read(); } catch(IOException e) {in = -1; } if ((char) in == '0') return; System. out. println(in); } } } © Björn Eiderbäck 1999 - 27 -
Exempel: dialog med stränginmatning package Tests; import java. io. *; class Test. IO { public static void main(String [] args) throws IOException { System. out. println("TEST OF INTERACTION/1"); Buffered. Reader in = new Buffered. Reader( new Input. Stream. Reader(System. in)); for(; ; ) { System. out. print(">"); String line = in. read. Line(); if ((line == null) || (line. equals. Ignore. Case("quit"))) break; if (line. equals. Ignore. Case("help")) System. out. println("To quit: write 'quit'"); else System. out. println("teko: " + line); } }} © Björn Eiderbäck 1999 - 28 -
- Slides: 28