OOMPA 2D1359 Föreäsning 7 Objektorienterad Modeering Programmering och Anays Innehå Pragmatisk översikt av Java Java kort översikt Kasser: attribut, metoder, konstanter, arv Abstrakta kasser Interface Exempe - 1 - Java Java är konstruerat på SUN Första versionen säpptes 1995 Starkt typat Dvs det går att avgöra typkompatibiitet av aa uttryck i programmet vid kompieringstifäet. Virtue maskin (VM) som gör det maskinoberoende En specie VM per pattformstyp överbryggar oikheter i pattformarnas arkitektur Kassbibiotek språkkasser, stränghantering, grafik, gränssnitt, fönster, nät, händesehantering, processer, coections, mm Bindning ti WWW med appets och iknande Har fått sin huvudsakiga spridning via Internet Syntax som C, semantik och kasser mer som Smatak - 2-1
Virtue maskin käkod kompiera (javac) java bytekod kör (java) en virtue maskin per pattformstyp Pc VM Mac VM Unix VM - 3 - Java: mitt första "program" Skapa en fi med namnet MyFirstProgram.java Skriv föjande kod i fien: import java.io.*; pubic cass MyFirstProgram{ pubic static void main (String [] args) { System.out.printn("Mitt första program!"); - 4-2
... kompiera och kör Kompiera >javac MyFirstProgram.java Då genereras en körbar fi MyFirstProgram.cass Kör genom att starta Javas virtuea maskin med program/kassnamnet som argument >java MyFirstProgram Mitt första program! Regen är att kassens static void main-metod atid exekveras - 5 - Ett "Javaprograms" struktur Kaas också för medemmar En kass ser ut på föjande sätt pubic cass KassNamn extends SuperKassNamn{ attribut (instans- och kassvariaber) metoder (instans- och kassmetoder) konstruktörer En metod modifierare returtyp funktionsnamn(argument){ programsatser - 6-3
Konstruera kass Kassnamn = finamn En kass ska ha samma namn som den fi den paceras i Kassen Circe i fien Circe.java En fi kan innehåa fera kasser men bara en av dem kan vara dekarerad pubic, Det är den pubika kassens namn som motsvarar fiens Definition av kass, ma pubic cass KassNamn extends SuperKassNamn{ attribut (instans- och kassvariaber) metoder (instans- och kassmetoder) konstruktörer - 7 - Dekarera och instansiera Dekaration av instans KassNamn variabenamn; Instansiering variabenamn = new KassNamn(); aternativt, både dekaration och instansiering på en gång KassNamn variabenamn = new KassNamn(); - 8-4
Kompiera och köra Environmentvariabe Gör först (NADA) modue add java Hemma bör du expicit sätta path (se systemdokumentation) Om du har en egen java-kataog kan det vara idé att sätta environmentvariaben CLASSPATH setenv CLASSPATH $HOME/MyJAVA:. Kompiera med javac finamn javac Kassnamn.java om at går bra skapas då en fi med namnet Kassnamn.cass Kör med java kassnamn java Kassnamn - 9 - Exempe: Kass // Kassdefinition (utan extends medför subkass ti Object) pubic cass Circe {pubic doube x, y; attribut pubic doube r; pubic doube circumference(){return 2 * 3.14 * r; pubic doube area(){return 3.14 * r * r; metoder // för att testa skriver vi en static main-metod // som används då man kör från termina pubic static void main (String args[]) { //Vi dekarerar en temporär variabe Circe circe; // och instansierar circe = new Circe(); - 10-5
... forts... //vi ändrar några värden circe.x = 100; circe.y = 200; circe.r = 20; // vi gör några testutskrifter System.out.printn("Cirkens x-koordinat: " + circe.x + " och dess y-koordinat: " + circe.y); System.out.printn("den har en radie också: " + circe.r); System.out.printn( "genom anrop av metoden circumference: " + circe.circumference() + " fick vi omkretsen"); System.out.printn("och med area:" + circe.area() + " dess area"); - 11 -... och så sparar vi, kompierar och kör Spara Spara fien med samma namn som kassen med extension.java, dvs här Circe.java Kompiera javac Circe.java Skapar en fi Circe.cass Kör java Circe - 12-6
Exempe: Eka argument Skapa fi Echo.java (som ekar givna argument) pubic cass Echo { pubic static void main(string[] argv) { for(int i = 0; i < argv.ength; i++) System.out.print(argv[i] + " "); System.out.print("\n"); System.exit(0); Kompiera javac Echo.java Kör java Echo detta är input - 13 - Syntax sammanfattning kassdefinition superkass (kan uteämnas om Object ska vara superkass) vektor med strängar pubic cass Echo extends Object{ kassmetod pubic static void main(string[] argv) { "begin" med static for-oop for(int i = 0; i < argv.ength; i++) skriv ut på termina System.out.print(argv[i] + " "); System.out.print("\n"); System.exit(0); "end" metoden main beskriver huvudprogrammet (då man kör från termina) pubic anger att kass eer metod är synig för aa kasser, metoder och variaber måste atid dekareras med typ - 14 - ny rad avbryt programmet 7
Fera konstruktörer // Kassdefinition med fera konstruktörer pubic cass Circe { //... attribut som tidigare... Argumenten kan ha samma namn som instansvariaberna pubic Circe (doube x, doube y, doube r){ // men då måste vi referera instansvariaberna mha this.ivar this.x = x; this.y = y; this.r = r; definition av en konstruktör som tar en annan cirke som argument pubic Circe(Circe c){x = c.x; y = c.y; r = c.r; oika typer av argument ger oika metoder (överagring) pubic Circe(doube r){this.r = r;... - 15 - Exempe: ampa1 pubic cass Lamp1 { protected booean ison; pubic void turnon() {ison = true; pubic void turnoff() {ison = fase; pubic booean ison() {return ison; pubic void togge() {ison =!ison(); pubic static void main (String args[]) { Lamp1 amp; amp = new Lamp1(); System.out.printn(amp.isOn()); //fase amp.togge(); System.out.printn(amp.isOn()); - 16-8
Exempe: ampa2 pubic cass Lamp2 { // defutvärde för ison kan anges vid dekarationen protected booean ison = true; // medemsmetoderna som förut... pubic static void main (String args[]) { Lamp2 amp; amp = new Lamp2(); System.out.printn(amp2.isOn()); //true amp.togge(); System.out.printn(amp.isOn()); - 17 - Kassvariabe // Kassvariabe med static pubic cass Circe { kassvariabe pubic static doube defautr = 5; vi kan använda kassvariaben för att tex initiera instanvariaber pubic doube x = 0, y = 0, r = defautr; konstant (som ej kan ändras) med fina pubic static fina doube PI = 3.14159265358979323846; - 18-9
Exempe: ampa3 pubic cass Lamp3 { // statisk/kass variabe som deas av aa instanser private static booean defautonvaue = fase; protected booean ison = defautonvaue; //... metoderna som förut pubic static void main (String args[]) { Lamp3 amp; amp = new Lamp3(); System.out.printn(amp.isOn()); amp.togge(); System.out.printn(amp.isOn()); - 19 - Exempe: ampa4 (med def av konstruktörer) pubic cass Lamp4 { // medemsmetoderna som förut // Vi definierar "egna" konstruktörer pubic Lamp4() {ison = fase; pubic Lamp4(booean boo) {ison = boo; pubic static void main (String args[]) { Lamp4 amp1 = new Lamp4(); Lamp4 amp2 = new Lamp4(true); System.out.printn("Lampa 1: " + amp1.ison() + ", Lampa 2: " + amp2.ison()); amp1.togge(); amp2.togge(); System.out.printn("Lampa 1: " + amp1.ison() + ", Lampa 2: " + amp2.ison()); - 20-10
Konstruktör som använder annan konstruktör använd konstruktionen this(...) först i annan konstruktör // vi kan använda en av dom andra konstruktörerna pubic Circe(doube x, doube y){this(x, y, 3); pubic Circe(){this(12, 13); //test pubic static void main (String args[]) { Circe c1 = new Circe(); c1.r = 1000; Circe c2 = new Circe(c1); Circe c3 = new Circe(17, 18); Circe c4 = new Circe(500); - 21 - main (forts) // testutskrifter System.out.printn("c1 x: " + c1.x + " y: " + c1.y + " r: " + c1.r); System.out.printn("c2 x: " + c2.x + " y: " + c2.y + " r: " + c2.r); System.out.printn("c3 x: " + c3.x + " y: " + c3.y + " r: " + c3.r); System.out.printn("c4 x: " + c4.x + " y: " + c4.y + " r: " + c4.r); utmatningen bir: c1 x: 12 y: 13 r: 1000 c2 x: 12 y: 13 r: 1000 c3 x: 17 y: 18 r: 3 c4 x: 0 y: 0 r: 500-22 - 11
Exempe: ampa5 (en konstruktör använder en annan) pubic cass Lamp5 { //... pubic Lamp5() {this(fase); pubic Lamp5(booean ison) {this.ison = ison; pubic static void main (String args[]) { Lamp5 amp1 = new Lamp5(); Lamp5 amp2 = new Lamp5(true); System.out.printn("Lampa 1: " + amp1.ison() + ", Lampa 2: " + amp2.ison()); amp1.togge(); amp2.togge(); System.out.printn("Lampa 1: " + amp1.ison() + ", Lampa 2: " + amp2.ison()); - 23 - Exempe: Book pubic cass Book { private String tite, author, isbn; pubic Book(String name, String author, String isbn) { tite = name; this.author = author; this.isbn = isbn; pubic Book(String name) {this(name, ""); pubic Book(String name, String author) {this(name, author, ""); pubic String tostring() {return "Tite: " + tite + " Förf: " + author + " ISBN: " + isbn; pubic static void main (String args[]) { Book book1 = new Book("XXX with Java", "Budd"); Book book2 = new Book("Y Undistied"); System.out.printn("Bok 1: " + book1); System.out.printn("Bok 2: " + book2); - 24-12
Inkudera kasser från andra fier // inkudera kod från bibiotek med import import java.awt.point; importera Point pubic cass Figure { // med protected kan variaben enbart äsas av instanser // eer instanser av subkasser protected Point position = new Point(10, 20); // fast vi kan ge en pubik inspektor pubic Point position() {return position; // en annan metod kan anropa direkt pubic int x() {return position().x; this underförstått // eer med this.meddelande pubic int y() {return this.position().y; - 25 - testa pubic static void main (String args[]) { //Vi dekarerar en temporär variabe Figure f = new Figure(); System.out.printn("pos: " + f.position() + " x: " + f.x() + " y: " + f.y()); Resutat pos: java.awt.point[x=10,y=20] x: 10 y: 20-26 - 13
Subkass // arv med extends. Vi antar att vi skrivit kass Figure pubic cass Circe extends Figure{ pubic static void main (String[] args) { //Vi kan dekarera en variabe som tihörande typen Figure Figure v1 = new Figure(); //Vi kan dekarera variabe som tihörande typen Circe Circe v2 = new Circe(); //eer typen Figure Figure v3; // men ändå instansiera den som en Circe v3 = new Circe(); - 27 - och en test System.out.printn("pos: " + v1.position() + " x: " + v1.x() + " y: " + v1.y()); System.out.printn("pos: " + v2.position() + " x: " + v2.x() + " y: " + v2.y() + " area: " + v2.area()); // i v3 som är dekarerad som Figure kan vi inte använda area() // trots att den nu är en Circe System.out.printn("pos: " + v3.position() + " x: " + v3.x() + " y: " + v3.y()); // men med en typecast går det typecast System.out.printn(" area: " + ((Circe) v3).area()); // aternativt kan en metod med samma namn definieras i Figure // och då kommer ändå Circe:s area() användas vid v3.area() eftersom metoder binds dynamiskt Utmatning: pos: java.awt.point[x=10,y=20] x: 10 y: 20 pos: java.awt.point[x=12,y=13] x: 12 y: 13 area: 78.5398 pos: java.awt.point[x=12,y=13] x: 12 y: 13 area: 78.5398-28 - 14
Exempe: kassen Rect med subkass pubic cass Rect { //instansvariaber pubic int x1, y1, x2, y2; //konstruktörer pubic Rect(int x1, int y1, int x2, int y2) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; pubic Rect(int width, int height) { this(0, 0, width, height); pubic Rect() { this(0, 0); - 29 -... // metoder pubic void move(int detax, int detay) { x1 += detax; x2 += detax; y1 += detay; y2 += detay; pubic booean isinside(int x, int y) { return ((x >= x1) && (x <= x2) && (y >= y1) && (y <= y2)); pubic Rect union(rect r) { return new Rect((this.x1 < r.x1)? this.x1 : r.x1, (this.y1 < r.y1)? this.y1 : r.y1, (this.x2 > r.x2)? this.x2 : r.x2, (this.y2 > r.y2)? this.y2 : r.y2); - 30-15
... pubic Rect intersection(rect r) { Rect resut = new Rect((this.x1 > r.x1)? this.x1 : r.x1, (this.y1 > r.y1)? this.y1 : r.y1, (this.x2 < r.x2)? this.x2 : r.x2, (this.y2 < r.y2)? this.y2 : r.y2); if (resut.x1 > resut.x2) { resut.x1 = resut.x2 = 0; if (resut.y1 > resut.y2) { resut.y1 = resut.y2 = 0; return resut; pubic String tostring() { return "[" + x1 + "," + y1 + "; " + x2 + "," + y2 + "]"; - 31 -... och en test (i en separat testkass)... pubic cass RectTest { pubic static void main(string[] args) { Rect r1 = new Rect(1, 1, 4, 4); Rect r2 = new Rect(2, 3, 5, 6); Rect u = r1.union(r2); Rect i = r2.intersection(r1); if (u.isinside(r2.x1, r2.y1)) System.out.printn("(" + r2.x1 + "," + r2.y1 + ") is inside the union"); System.out.printn(r1 + " union " + r2 + " = " + u); System.out.printn(r1 + " intersect " + r2 + " = " + i); - 32-16
... och subkassen DrawabeRect pubic cass DrawabeRect extends Rect { pubic DrawabeRect(int x1, int y1, int x2, int y2) { super(x1,y1,x2,y2); pubic void draw(java.awt.graphics g) { g.drawrect(x1, y1, (x2 - x1), (y2-y1)); - 33 - Kass Person med definition av printrutin import java.uti.date; pubic cass Person { pubic String name = ""; pubic Date dateofbirth; pubic Person(String name, Date date) {this.name = name; dateofbirth = date; pubic Person(String name) {this(name, new Date()); pubic int age(){ Date now = new Date(); return now.getyear() - dateofbirth.getyear(); // med tostring definierar vi hur objektet presenterar sig pubic String tostring(){ return "Namn: " + name + " född: " + dateofbirth; - 34-17
och så prövar vi ba tostring pubic static void main (String args[]) { Person p1 = new Person("Kae"); System.out.printn(p1); utmatning: Namn: Kae född: Mon Sep 21 15:45:01 MET 1998-35 - Med super kan vi använda metoder i superkass pubic cass Empoyee extends Person { // en statisk (kassvariabe) används för att räkna // anstäda (dvs egentigen anta instanser) static int numberofempoyers = 0; pubic int number; // Med super kommer vi åt superkassens definition pubic String tostring(){return super.tostring() + " anstäningsnummer: " + number; // för att använda superkassens konstruktör används också //super som ska stå först, med syntax: super(argument) pubic Empoyee(String name) {super(name); numberofempoyers = numberofempoyers + 1; number = numberofempoyers; - 36-18
Abstrakt kass eer metod pubic abstract cass ForceOverride { genom att dekarera en metod abstrakt kan vi tvinga subkasser att omdefiniera (annars kan dom inte instansieras) pubic abstract String myname(); pubic String tostring() {return "Namn: " + myname(); - 37 - I packages kan vi definiera kasser som hör ihop och senare kan importeras tisammans package MinaFigurer; //ska stå först import java.awt.point; pubic abstract cass Figure { protected Point position = new Point(10, 20); pubic Point position() {return position; pubic int x() {return this.position().x; Namnet på en package ska vara detsamma som den kataog fien befinner sig i viket ba medför att oika kasser i en viss package befinner sig i samma kataog - 38-19
andra kasser i samma package Circe.java Rectange.java package MinaFigurer; pubic cass Circe extends Figure{ private doube r = 10; pubic doube radius(){return r;; pubic void radius(doube newr){r = newr; package MinaFigurer; import java.awt.point; pubic cass Rectange extends Figure{ pubic Rectange(){ position = new Point(100, 200); - 39 - Interface Ett interface definierar ett gränssnitt Detta kan sedan användas av oika kasser i systemet Ett sätt att behåa statisk typning fast ändå tiåta att oika kasser dear på ett gränssnitt utan att tvinga dem att ha gemensam superkass eer införa mutipet arv pubic interface Drawabe{ pubic void setcoor(coor c); pubic void setposition(point p); pubic void draw(window dw); ett interface impementeras av en kass pubic cass VisuaComponent impements Drawabe{... - 40-20
... Interface pubic DrawabeRectange extends Rectange impements Drawabe{ private Coor c; private Point pos; pubic void setcoor(coor c) {this.c = c; pubic void setposition(point p){pos = p; pubic void draw(window dw){dw.drawrect(pos.x, pos.y, height, width); Ett interface kan utökas pubic interface Transformabe extends Scaabe, Rotateabe, Refectabe { eer innehåa konstanter interface Constants {static fina int Weekdays = 7; - 41 - TextIO (och undantagshantering) import java.io.*; cass ReadCharTest { pubic static void main(string[] args) { System.out.printn("Java!"); // Läs ett tecken innan programmet avsutas try { int ch = System.in.read(); catch (IOException e) { // Ignorera - 42-21
Med Ström Vi kan också äsa in mha en ström och buffert //Prompt System.out.print(">"); //Läs in BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); ine = reader.readline(); //Sen kan vi testa vad som matades in if (ine.equas("sut")) //...; - 43 - Exempe: en egen sumptasgenerator pubic cass Randomizer { static fina int m = 233280; static fina int a = 9301; static fina int c = 49297; int seed = 1; pubic Randomizer(int seed) { this.seed = seed; pubic foat randomfoat() { seed = (seed * a + c) % m; return (foat)seed/(foat)m; pubic int randomint(int max) { return Math.round(max * randomfoat()); pubic static void main(string[] args) { Randomizer r = new Randomizer((int)new java.uti.date().gettime()); for(int i = 0; i < 10; i++) System.out.printn(r.randomInt(100)); - 44-22
Exempe: Person med subkass Student konstant med fina pubic cass Person { pubic static fina String unspecified = "OSPECAT"; protected String name, address, phone; pubic Person(String name, String address, String phone) { this.name = name; this.address = address; this.phone = phone; pubic Person(String name) {this(name, unspecified); pubic Person(String name, String address) {this(name, address, unspecified); anropa annan konstruktör pubic String tostring() {return "Namn: " + name + " Address: " + address + " Te: " + phone; - 45 -... pubic static void main (String args[]) { Person pers1 = new Person("Kae", "Osquars Backe 2"); Person pers2 = new Person("Oe"); System.out.printn("Person 1: " + pers1); System.out.printn("Person 2: " + pers2); - 46-23
...och subkassen Student... pubic cass Student extends Person { protected String emai; Student subkass ti Person pubic Student(String name, String address, String phone, String emai) { använd superkassens super(name, address, phone); konstruktör this.emai = emai; pubic Student(String name, String address, String phone) { this(name, address, phone, unspecified); pubic Student(String name) {this(name, unspecified); pubic Student(String name, String address) {this(name, address, unspecified); använd superkassens tostring() pubic String tostring() {return super.tostring() + " Emai: " + emai; - 47 -... pubic static void main (String args[]) { Student stud1 = new Student("Kae", "Osquars Backe 2"); Student stud2 = new Student("Oe"); Student stud3 = new Student("Kae", "Osquars Backe 2", "1234", "Kae@nada.kth.se"); System.out.printn("Student 1: " + stud1); System.out.printn("Student 2: " + stud2); System.out.printn("Student 3: " + stud3); - 48-24
Exempe: Enkeänkad ista // en enkeänkad ista med metoder för att undersöka om objektet är sist, stoppa in änk samt ge avstånd ti sutet cass LinkabeObject{ pubic LinkabeObject ink; pubic Object vaue; pubic String tostring() {return vaue.tostring(); pubic LinkabeObject() {this(nu); pubic LinkabeObject(Object vaue) { ink = nu; this.vaue = vaue; pubic booean atend(){return ink == nu; pubic void insert(linkabeobject next) { ink = next; pubic int distancetoend(){ return atend()? 0 : 1 + ink.distancetoend(); - 49 - test pubic cass LinkabeTestB{ pubic static void main (String args[]) { LinkabeObject root = new LinkabeObject("ROOT"); LinkabeObject current; current = root; for(int i=1; i < 5; i++) { // För att kunna använda en int som ett Object konstruerar vi en Integer LinkabeObject newlinkabe = new LinkabeObject(new Integer(i)); current.insert(newlinkabe); current = newlinkabe; current = root; whie(current!= nu) { System.out.printn(current + " distance to end: " + current.distancetoend()); current = current.ink; - 50-25
Exempe: Dubbeänkad ista cass DoubeLinkabeObject{ pubic DoubeLinkabeObject next, prev; pubic Object vaue; pubic String tostring() {return vaue.tostring(); pubic DoubeLinkabeObject() {this(nu); pubic DoubeLinkabeObject(Object vaue) {next = prev = this; this.vaue = vaue; pubic void insert(doubelinkabeobject adoubelinkabeobject) { this.next.prev = adoubelinkabeobject; adoubelinkabeobject.next = this.next; adoubelinkabeobject.prev = this; next = adoubelinkabeobject; pubic int distanceto(doubelinkabeobject adoubelinkabeobject){ return this == adoubelinkabeobject? 0 : 1 + next.distanceto(adoubelinkabeobject); pubic int ength(){return 1 + next.distanceto(this); - 51 - pubic cass DoubeLinkabeTest{ pubic static void main (String args[]) { DoubeLinkabeObject root = new DoubeLinkabeObject("ROOT"); DoubeLinkabeObject current; current = root; for(int i=1; i < 5; i++) { // För att kunna använda en int som ett Object konstruerar vi en Integer DoubeLinkabeObject newlinkabe = new DoubeLinkabeObject(new Integer( i)); current.insert(newlinkabe); current = newlinkabe; current = root.next; whie(current!= root) { System.out.printn(current + " distance to root: " + current.distanceto(root)); current = current.next; System.out.printn( "ength: " + root.ength()); - 52-26