160 likes | 361 Views
Fordon. int antalhjul; int vikt;. Bil. private String regnr; private int årsmodell;. Sid 41. Klassen Bil ärver från klassen Fordon. Istället för arv så kan man använda ordet härleds, klassen Bil härleds ur klassen Fordon. Superklass till Bil. class Bil extends Fordon{ private int ….
E N D
Fordon int antalhjul; int vikt; Bil private String regnr; private int årsmodell; Sid 41 Klassen Bil ärver från klassen Fordon. Istället för arv så kan man använda ordet härleds, klassen Bil härleds ur klassen Fordon. Superklasstill Bil class Bil extends Fordon{ private int …. Subklass till Fordon (c) Ulf Kihlsten
Fordon int antalhjul; int vikt; Bil private String regnr; private int årsmodell; Sid 42 Superklasstill Bil Överst på sidan beskrivs i vilken ordning saker sker om man skriverBil b = new Bil();Först skapas Fordon och sedan Bil vilka tillsammans bildar det objekt som referensvariabel b ”pekar” på. Subklass till Fordon (c) Ulf Kihlsten
Bil Personbil Lastbil private String regnr; private int årsmodell; nt antplatser; nt maxlast; Sid 42 forts. Fordon int antalhjul; int vikt; Resten av sidan handlar om att man kan ha arv i flera led och att en klass kan vara superklass till flera klasser. I det här fallet är Bil superklass till klasserna Personbil och Lastbil.Observera att en klass bara kan ha en superklass, d.v.s. en klass kan bara ärva in en klass På den här sidan finns det 2 superklasser och 3 subklasser. Längst ner på sidan nämns att om en klass inte använder nyckelordet extends så är det underförstått att den ärver in klassen Object. Alla klasser har alltså en superklass frånsett klassen Object förståssss. (c) Ulf Kihlsten
Sid 43 • Två nya saker dyker upp på denna sida • En klass har försetts med en metod. Metoden borde också ha haft en synlighetsmodifierare enligt:public void visa() { • Konstruktorn i klassen Cirkel styr vilken konstruktor den vill ”köra” i superklassen Punkt enligt:super(xx, yy);Detta är viktigt att förstå, eftersom det ger en väldig möjlighet att skapa flexibel kod, d.v.s. beroende på vilken konstruktor man anropar så får det skapade objektet olika egenskaper. (c) Ulf Kihlsten
Bil Personbil publiv void visa(){ Sid 44 Fordon publiv void visa(){ Under rubriken ”Vilken metod används” så tas en viktig sak upp. I vidstående arvskedja så finns det två metoder med namnet visa.Om vi skriver följande kod: Personbil pb = new Personbil();pb.visa(); så vill vi dels skapa ett objekt av typen Personbil och dels anropa metoden visa. Nu finns det ingen metod visa i klassen Personbil men det spelar ingen roll, JVM ser att Personbil har ärvt in klassen Bil, och fortsätter att leta i i den klassen och finner metoden där.Detta är en ”grundlag” i Java. En vanlig kodteknik är att låta en metod anropa en annan metod i sin superklass.Att låta metoden visa i klassen Bil anropa metoden visa i sin superklass Fordon enligt: super.visa(); skulle vara högst användbart. (c) Ulf Kihlsten
Sid 44 forts + sid 45. Längst ner på sidan tas synlighetsmodifierarna privat och default upp samt på sid 45 protected. Det som är ”märkt” med ordet private i en klass syns bara inom den egna klassen. Det som är ”märkt” med ordet protected inom en klass kan bara ses av de klasser som ärver klassen. Protected är alltså startkt förknippad med arv. Det som inte har någon synlighetsmodifierare alls (default) är bara synligt inom samma paket. Paketeller package blir riktigt intressanta först när du bygger upp ett eget utvecklingsbibliotek och skall hålla ordning på alla dina klasser. Just nu räcker det att se ett package som den mapp du lagrar dina Java program i. Paket tas upp lite grundligare på sid. 53 i boken. (c) Ulf Kihlsten
Sid 45. Kommentar till avsnittet Använda metoder…. Instansvariabler skall vara privata, det är liksom en av meningarna med OOP.De ”bäddas” på så sätt in i klassen och övriga klasser som vill utnyttja dem måste gå vägen via en metod som är public. På så sätt får vi säkrare kod eftersom ingen kan hitta på egna sätt att modifiera instansvariablerna. Public class Aclass{ private int posX; private int pos Y; public void setPosX( int v1 ){ posX = v1; Aclass a = new Aclass(); a.setPosX( 12 ); (c) Ulf Kihlsten
Cirkel Cylinder Sid 46 Punkt Om du skapar ett objekt enligt: Cylinder c = new Cylinder(); så kommer en kedja av konstruktorer att anropas.Anropen styrs antingen av hur du använder nyckelordet super eller av kompilatorn. Anropar du ingen konstruktor så kommer kompilatorn att skapa ett anrop på en tom konstruktor. Oavsett vilket, så kommer minst tre konstruktorer att anropas, en per klass. Först anropas en konstruktor för Cylinder, sedan en fär Cirkel och sedan en för Punkt.Sedan körs koden i konstruktorn fär Punkt, Cirkel och Cylinder, objektet byggs alltså uppifrån. (c) Ulf Kihlsten
Sid 46 övning 1 - 3 • Kommentarer till övningar • Gratte har dela upp lösningen i 1a, 1b och ic.1a: Cirkel styr vilken konstruktor den vill anropa i Punkt, i annat fall skulle vi få kompileringsfel, eftersom det inte finns någon konstruktor med noll antal parametrar i Punkt.1b: Instansvariablerna x och y i Punkt har definierats som protected, därför kan de anropas direkt i Cirkels: metod visa().1c: X och y är privata igen, därför krävs ett anropet super.visa() används i Cirkel för att kunna komm åt värdena, de är ju inkapslade i Cirkel. • Överlagring av konstruktorer i Bil ger den som vill använda klassen flexibilitet.Nyckelordet super används på två olika sätt, anropa av en konstruktor eller en metod i superklassen.Protected används som i föeregående uppgift. • Ett tryckfel, Utvidga klassen Kvadrat skall det stå.Inget nytt i exemplet. (c) Ulf Kihlsten
Sid 47-48 ”Flera nivåer”. Använd klassträdet på bild 9 ”sid 46” i denna presentation ihop med texten i boken, Den text som hänger ihop med klassträdet på bild 9 gäller för bokens text också. (c) Ulf Kihlsten
Punkt Cirkel Cylinder Sid 48 ”Polymorfism”. Polymorfism är en ganska avancerad programmerings-teknik som kan användas på klasser som utnyttjar arv.Polymorfism bygger på en enkel regel:En referensvariabel av en ”högre typ” i ett arvsträd kan alltid lagra en referensvariabel av en ”lägre typ”.Exempel:Punkt pkt; // En referensvariabel av typen Punkt.Vi kan nu skriva kod som:pkt = new Cirkel();Cylinder cyl = new Cylinder();pkt = cyl; Allt enligt regeln ovan. Vi kan dock inte skriva:Cylinder c = new Cirkel();eftersom Cylinder är på en lägre nivå än Cirkel. Hur kan vi utnyttja detta?Se nästa bild. (c) Ulf Kihlsten
Punkt Cirkel Cylinder Sid 48 ”Polymorfism forts.”. Vi kan t.ex. skapa en metod enligt följande:public void myPolyMetod( Punkt p ) { Det fiffiga är att metoden kan ta emot objekt av typen Punkt, Cirkel och Cylinder, eftersom p är en referensvariabel av en ”högre typ” än övriga två. Nytt exempel: Punkt pArr[] = new Punkt(5); Vi har här ett fält som kan lagra referens variabler av typen Cylinder, Cirkel och punkt. Om vi sedan har en metod visa() i alla tre klasserna så kan vi skriva följande intelligenta kod: for( int i = 0; i < 5; i++){ pArr[i].visa(); } Koden ”bryr” sig inte om vilken typ det är på objektet, det får JVM sköta om. Det är detta sista exempel som Gratte använder för att beskriva polymorfism i boken. Polymorfism bygger på arv! (c) Ulf Kihlsten
Sid 50-51 ”Abstrakta klasser”. Det som skrivs om abstrakta klasser är ganska bra, framförallt texten på sidan 51. Här kommer ett litet bidrag till texten. En abstrakt klass är så generell att det inte är någon mening att instansiera den, den är "av naturen" en superklass och skall ärvas in i andra klasser där den kompletteras med kod. Abstrakta klasser hör nog mer hemma i OOD Objekt Orienterad Design än i OOP. (c) Ulf Kihlsten
Sid 51 ”Interface”. Om du implementerar ett interface, och det kommer vi att göra många gånger under resten av kursen, så sluter du ett avtal med kompilatorn. Avtalet går ut på att du förbinder dig att skriva kod för vissa metoder i din klass. I annat fall kommer kompilatorn inte att godkänna din kod.I boken visas ett exempel med ett interface som heter Bas.Du implementerar det med nyckelordet implements, och då förbinder du dig att skapa metoderna rita och sättfärg. Vitsen med detta kan uttryckas så här: om du vill använda en viss tjänst så måste du följa vissa regler för hur du skall använda tjänsten. I annat fall får du fixa tjänsten själv, d.v.s. uppfinna hjulet på nytt. (c) Ulf Kihlsten
Sid 51+ 52” final”. Ordet final betyder i Java slutgiltig.Alla gånger du ser ordet i Java så betyder det alltså att ”detta är den slutgiltiga versionen”. Några exempel: final class My { final int myInt = 10; public final void method myMethod{ I tur och ordning så betyder detta:klassen My kan inte ärvasmyInte kan inte ges ett annat värde än 10.Metoden MyMethod kan inte överridas( override) (c) Ulf Kihlsten
Sid 53+ 54” Package”. • Paket beskrivs på ett ganska bra sätt i boken. Trots det så är det ganska svårt att ta till sig vad som menas med begreppet.Detta vill jag dock att du skall förstå om paket: • De används för att slippa skriva så mycket kod, se ordet import ii boken. • Ditt paket som du alltid arbetar i under denna kurs har samma namn som mappen där du förvara dina java program i. • Resterande kunskaper är överkurs. • Dock, en liten reflektion: • De som designade Java har i två fall gjort något som överraskar åtminstone mig. Det ena är när man namnger en javafil, klassnamnet måste ha samma namn som den fysiska filen. Det andra är att man använder fysiska mappnamn för att bygga upp det man kalla package. • Att leva så nära verkligheten är mycket ovanligt i datavärlden, (c) Ulf Kihlsten