280 likes | 462 Vues
OOMPA 1999 Föreläsning 3. Objektorienterad Modellering Programmering och Analys. Objektorientering grunder-2 Komponenter och beteende Java introduktion och översikt kort historik Javas arkitektur klass, metod, attribut något om virtuell maskin, klasser, filer och kompilering.
E N D
OOMPA 1999 Föreläsning 3 Objektorienterad Modellering Programmering och Analys Objektorientering grunder-2 Komponenter och beteende Java introduktion och översikt kort historik Javas arkitektur klass, metod, attribut något om virtuell maskin, klasser, filer och kompilering
En komponent • En komponent karaktäriseras genom sitt beteende • Dvs vad kan den göra • En komponent brukar delas upp i: • Beteende • Vad kan komponenten göra • Protokoll • Tillstånd • Vilken information är knuten till komponenten • Informationen kan ändras över tiden
Dela upp på delkomponenter • Identifiera vad som skall göras och sedan vem som skall göra det • Då man börjar få någorlunda klart för sig vad man skall konstruera är det dags att identifiera komponenter • Komponenterna (systemen) delas sedan upp på delkomponenter (delsystem) • Detta är ofta en brainstormingliknande iterativ process
Tumregler • En komponent skall ha en liten mängd väldefinierat och meningsfullt ansvar • Ändringar skall påverka så få som möjligt • 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
Parnas principer • 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 • Utvecklaren av en mjukvarukomponent måste erbjudas all nödvändig information, men ingen annan, för att kunna utföra komponentens tilldelade ansvar
Java • Java är konstruerat på SUN • Första versionen släpptes 1995 • Starkt typat • Dvs det går att avgöra typkompatibilitet av alla uttryck i programmet vid kompileringstillfället. • Virtuell maskin (VM) som gör det maskinoberoende • En speciell VM per plattformstyp överbryggar olikheter i plattformarnas arkitektur • Klassbibliotek • språkklasser, stränghantering, grafik, gränssnitt, fönster, Internet, händelsehantering, processer, collections, mm • Bindning till WWW • med applets och liknande • Har fått sin huvudsakliga spridning via Internet • Syntax som C. Semantik och klasser mer som Smalltalk
Virtuell maskin kompilera (javac) källkod java bytekod kör (java) en virtuell maskin per plattformstyp Mac VM Pc VM Unix VM
Java: mitt första "program" • Skapa en fil med namnet MyFirstProgram.java • Skriv följande kod i filen: import java.io.*; public class MyFirstProgram{ public static void main (String [] args) { System.out.println("Mitt första program!"); } }
... kompilera och kör • Kompilera >javac MyFirstProgram.java • Då genereras en körbar fil MyFirstProgram.class • Kör genom att starta Javas virtuella maskin med program/klassnamnet som argument >java MyFirstProgram Mitt första program! • Regeln är att klassens static void main-metod alltid exekveras
Kallas också för medlemmar Ett "Javaprograms" struktur • En klass ser ut på följande sätt public class KlassNamn extends SuperKlassNamn{ attribut (instans- och klassvariabler) metoder (instans- och klassmetoder) konstruktörer } • En metod • modifierare returtyp funktionsnamn(argument){ • programsatser • }
Konstruera klass • Klassnamn = filnamn • En klass skall ha samma namn som den fil den placeras i • 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 • Definition av klass, mall public class KlassNamn extends SuperKlassNamn{ attribut (instans- och klassvariabler)metoder (instans- och klassmetoder)konstruktörer }
Deklarera och instansiera • Deklaration av instans KlassNamn variabelNamn; • Instansiering variabelNamn = new KlassNamn(); alternativt, både deklaration och instansiering på en gång KlassNamn variabelNamn = new KlassNamn();
Kompilera och köra • 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) • Kompilera med javac filnamn javac Klassnamn.java • om allt går bra skapas då en fil med namnet Klassnamn.class • Kör med java klassnamn java Klassnamn
Typer • I Java måste alla variabler och metoder deklareras med typ Typ variabel; • Det finns primitiva typer som int, char, float och boolean int x; • En variabel kan ges ett initialt värde vid deklarationen int x = 10; • Man kan också använda typer som är implementerade som vanliga klasser String course = "OOMPA-99";
Modifierare • 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 • indikerar att medlemmen är klassvariabel eller klassmetod public • medlemmen är accessbar överallt där dess klass är accessbar protected • medlemmen endast accessbar i klassen, dess subklasser eller i aktuellt package (vi återkommer till package vid senare tillfälle) private • medlemmen endast accessbar i den klass som definierar den
Exempel import java.io.*; public class BankAccount{ 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;} }
... BankAccount account1, account2; int transfer; account1 = new BankAccount(); account2 = new BankAccount(); account1.deposit(200); account2.deposit(100); transfer = 75; account1.withdraw(transfer); account2.deposit(transfer); account2.balance(); // resultat 175
På NADA • 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
Sammanfattning: Konstruera klass • Klassnamn = filnamn • En klass skall ha samma namn som den fil den placeras i • 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 • Definition av klass, mall public class KlassNamn extends SuperKlassNamn{ attribut (instans- och klassvariabler)metoder (instans- och klassmetoder)konstruktörer }
Sammanfattning: Deklarera och instansiera • Deklaration av instans KlassNamn variabelNamn; • Instansiering variabelNamn = new KlassNamn(); alternativt, både deklaration och instansiering på en gång KlassNamn variabelNamn = new KlassNamn();
Sammanfattning: Kompilera och köra • 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 • setenv CLASSPATH $HOME/MyJAVA:. • Kompilera med javac filnamn javac Klassnamn.java • om allt går bra skapas då en fil med namnet Klassnamn.class • Kör med java klassnamn java Klassnamn
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 * 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();
... 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"); } }
... och så sparar vi, kompilerar och kör • Spara • Spara filen med samma namn som klassen med extension .java, dvs här Circle.java • Kompilera javac Circle.java • Skapar en fil Circle.class • Kör java Circle
Exempel: Eka argument • Skapa fil Echo.java (som ekar argumenten vid exekveringen) 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); } } forloopar ser ut som i ANSI-C • Kompilera javac Echo.java • Kör java Echo detta är input
In- och utmatning • Textutmatning sker via klassen System System.out.println(...); • Där: • System är en klass i java.lang • out är en klassvariabel i System • out är en instans av klassen PrintStream • PrintStream 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}
Exempel: ”program” med teckeninmatning package Tests; import java.io.*; class TestIO_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); } } }
Exempel: dialog med stränginmatning package Tests; import java.io.*; class TestIO { public static void main(String [] args) throws IOException { System.out.println("TEST OF INTERACTION/1"); BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); for(;;) { System.out.print(">"); String line = in.readLine(); if ((line == null) || (line.equalsIgnoreCase("quit"))) break; if (line.equalsIgnoreCase("help")) System.out.println("To quit: write 'quit'"); else System.out.println("\teko: " + line); } }}