310 likes | 412 Views
Grundlæggende Programmering (GP) Efterår 2005 Forelæsning 7 Slides ligger på nettet. Du er velkommen til at printe dem nu. Vi begynder 9.15. www.itu.dk/courses/GP/E2005. Martin Lillholm. Obligatorisk opgave. Var opgaven til i onsdags For nem For svær
E N D
Grundlæggende Programmering (GP)Efterår 2005Forelæsning 7Slides ligger på nettet. Du er velkommen til at printe dem nu.Vi begynder 9.15.www.itu.dk/courses/GP/E2005 Martin Lillholm
Obligatorisk opgave • Var opgaven til i onsdags • For nem • For svær • Tilpas – skulle bruge noget tid og tanker på den, men så var den også til at løse/forstå. • Er der nogen, der ikke har afleveret fordi den slet ikke var til at få hul på?
Hvad skal jeg lave i efterårsferien? • Høste kartofler … • Plukke svampe … • Besøge mor … • Repetere GP – jubii • Læs pensum igen • Løs eventuelt manglende obligatoriske opgaver • Gamle eksamensopgaver
Sidste gang • Ganske kort om programudvikling • En slags UML klassediagrammer • Klasser • Attributter (felter, klassevariable) • Metoder inkl. konstruktører • Afhængigheder (dependencies) • Aggregations kursorisk • Mere om statiske variable (klassevariable) og metoder • Mere om metoder og parametre og virkefelt (scope)
Denne gang • Nedarvning • Skrivning til tekstfil • Eventuelt repetition af static-begrebet
Nedarvning • Motivation ... • Design et system til håndtering af ansatte og studerende på ITU. En ansat kan enten være en VIP eller en TAP • En studerende kendetegnes ved navn, højde, studieretning • En ansat kendetegnes ved navn, højde, afdeling • En VIP kendetegnes yderligere ved et forskningsområde • En TAP kendetegnes yderligere ved et arbejdsområde • Alle har naturligvis også en række ansvar (metoder), men dem ignorerer vi indtil videre
Naiv implementation uden hensyn til fælles egenskaber public Class Student { private String name; private int height; private String study; // constructors, accessors, // and mutators ... } public Class Vip { private String name; private int height; private String department; private String researchArea; // constructors, accessors, // and mutators ... } public Class Tap { private String name; private int height; private String department; private String workArea; // constructors, accessors, // and mutators ... }
Nedarvning Ansat Studerende TAP Person VIP • Hvad har de tre typer personer til fælles: • De er alle personer med navn og højde • Både VIP’ere og TAP’ere er ansat i en afdeling
Implementation med nedarvning public Class Person { private String name; private int height; // constructors, accessors, // and mutators ... } public Class Employee extends Person { private String department; // constructors, // additional accessors, and mutators ... } public Class Student extends Person { private String study; // constructors, // additional accessors, and mutators ... } public Class Vip extends Employee { private String researchArea; // constructors, // additional accessors, and mutators ... } public Class Tap extends Employee { private String workArea; // constructors, // additional accessors, and mutators ... }
Nedarvning, navne og nøgleord • Vi benytter følgende ord om klassen der arves fra: • Superklasse • Forældreklasse • Baseklasse • Vi benytter følgende ord og vendinger om klassen der arver: • Subklasse • Barneklasse • Subtype (Subklassen er en (udvidet/specialiseret) superklasse)(En studerende er en person, en VIP er en ansat) • Subklassen er en specialisering af superklassen • Vi kalder en samling af klasser, hvor der indgår arv for et klassehierarki • Vi benytter nøgleordet extends efter et klassenavn for at indikere nedarvning: public class Students extends Person { ... }
Hvad er nedarvning ? • Nedarvning benyttes til at modellere klassers fælles egenskaber og dermed genbruge felter, metoder uden eksplicit at skulle genskrive de fælles dele – software genbrug • Husk at vi kan tænke på klasser som arbejdstegninger. Vi kan tænke på nedarvning som genbrug af tegninger; eventuelt med ændringer eller tilføjelser • Ideen er, at subklassen i udgangspunktet arver superklassens karakteristika (felter og metoder, men ikke konstruktører) • Vi kan tilføje yderligere felter og metoder og overskrive felter og metoder. (NB: Lad være med at overskrive felter) • Hvor er nedarvning (i nogen tilfælde) smart?
Nedarvning – eksempler • En ansat er en person • Heste, køer og grise er pattedyr • Volvo, Saab og Toyota er biler • En ordbog er en bog: • Words.java L&L side 440 i BlueJ
protected adgang • Vi har tidligere talt om indkapsling gennem brugen af private nøgleordet • En subklasse har ikke adgang til superklassens felter og metoder, hvis de er erklæret private. Det lyder umiddelbart meget restriktivt; hvorfor er det faktisk en god ide? • Hvis de derimod er erklæret public har subklassen fuld adgang, men det har alle andre klasser desværre også. Vi bryder med ideen om indkapsling • Et kompromis opnås ved brug af protected. Her får subklassen (og alle andre klasse i samme pakke) adgang • Words.java L&L side 440 i BlueJ igen
Hvad er det egentlig der arves ? • Felter uanset om de er erklæret public, private eller protected • Metoderuanset om de er erklæret public, private eller protected • Superklassens felter er altså med til at definere tilstanden af subklassens instanser, men er ikke nødvendigvis synlige/tilgængelige.Igen hvorfor giver det mening ?Indirekte adgang – indkapsling • Ikke konstruktører. Betyder det så at konstruktører skal skrives fra bunden og hvordan harmonerer det med eventuelle private felter ... ?
Object klassen • Enhver klasse arver implicit fra Object; anderledes sagt Object er roden i ethvert klassehieraki • Indeholder bl.a. metoden toString() • Altså har alle objekter altid en toString() • Returnerer et objekts klassenavn samt en unik identifikation (tal) • Inderholder bl.a. metoden equals (Object obj) • o1.equals (o2) returnerer true hvis o1 og o2 refererer samme objekt • Begge metoder overskrives typisk, men findes altså altid
super referencen og konstruktører • Hvis en subklasse ikke gives en konstruktør kaldes superklassens konstruktør automatisk med super()(Hvad hvis superklassen ikke har en argumentløs konstruktør?) • Det kan også gøres eksplicit (altid som første linie) i en skreven konstruktør og sker under alle omstændigheder implicit • Alternativt kan super anvendes til at kalde eventuelle andre konstruktører i superklassen: super(”Martin Lillholm”, 192cm) Hvis der eksempelvis arves fra Person klassen • I praksis betyder at subklassers konstruktører typisk skrives ved at kalde superklassens konstruktør først og derefter initialisere felter osv. der er unikke for subklassen. Vi fremmer igen indkapsling • Words2.java L&L side 445 i BlueJ
Overskrivning (overriding) • En subklasse kan overskrive de (fra superklassen) nedarvede metoder • Subklassens (nye) metode skal have samme signatur og returtype som superklassens ditto • Subklassens (nye) metode skal være mindst lige så tilgængelig som superklassens ditto • Selvom vi overskriver kan vi stadig tilgå superklassen oprindelige metoder vha super referencen – eks. super.toString(); (super vs this) • Nedarvede felter kan også ”overskrives”, MEN lad være • Hvorfor overskrive ... ?
Abstrakte klasser • Abstrakte klasser er klasser der ikke kan og ikke skal instantieres. Hvad betyder det for en reference, der har en abstrakt type (klasse) ? • Metoder kan enten være ”normale” eller abstrakte • Abstrakte metoder implementeres ikke, men skal overkskrives. • Bruges typisk om ikke realiserbare koncepter i et klassehieraki • Nøgleord abstract • Hvorfor abstrakte klasser ?
Nøgleordet final og arv • En metode der erklæres final kan ikke overskrives • Der kan ikke arves fra en klasse, der erklæres final • Det giver ikke mening at erklære abstrakte metoder final • Hvorfor ?
Multipel Arv • Benyttes hvis vi ønsker at aflede en klasse fra flere superklasser • Eksempel vis kunne en studerende både være en person og en borger og dermed arve fra begge ”forældre” • I praksis ganske kompliceret. Hvad hvis superklasserne eksempelvis har metoder med samme navn – hvilken metode arves ? • Understøttes ikke i Java, men derimod i eksempelvis C++
Det store motiverende eksempel • Cirkler og Rektangler som eksempler på former • InheritanceDriver.java • InheritancePanel.java • Shape.java • Circle.java • Rectangle.java • Findes alle på hjemmesiden
Strømme (Streams) • Hvorfor hedder det egentlig strømme ? • En ordnet sekvens af bytes • Et program kan arbejde med mange samtidige strømme • I/O (input/output) strømme • Input strømme • Standard input (System.in) • Filer • (Netværk) • Output strømme • Standard output (System.out, System.out.println) • Standard error (System.err, System.err.println) • Filer • (Netværk)
Filtyper & buffere • Tekstfiler • ASCII – hver byte er et tegn • Kan vises i en tekst-editor • Binære filer • Alt andet end tekstfiler • int, long, float, ... • jpg, wav, doc, ... • Hvordan ser man indholdet af en binær fil? • Buffere • Input • Output
Læsning fra tekstfil i Java (repetition) • Scanner klassen fra java.util.Scanner • Scanner scanFile = new Scanner (new File (”filenavn”)); • next(), nextLine(), nextInt(), nextDouble() • hasNext() • useDelimiter() f.eks. useDelimiter("\\s*[\\n,]\\s*"); • Er det her den fulde sandhed om læsning fra tekstfiler ... ? byte char String Fil BufferedReader FileReader strøm strøm String, char, int, double, ... Scanner Fil
Skrivning til tekstfil i Java • Eventuelt med en BufferedWriter indskudt mellem PrintWriter og FileWriter(Alle defineret i java.io) • PrintWriter metoder • println(...), print (...) • close() • En tekstfil oprettes eller overskrives ved når den åbnes • Husk at lukke filer efter endt skrivning! • IOException, (checked) .. skal behandles eller kastes videreIndtil vi har haft om exceptions blot med throws IOException Primitive typer, strenge, objekter byte char Fil PrintWriter FileWriter strøm strøm
Binære filer i Java ... • Ikke pensum
Skrivning til tekstfil i Java - eksempel Filewriter fw = new FileWriter (”test.dat”); BufferedWriter bw = new BufferedWriter (fw); PrintWriter outFile = new PrintWriter (bw); outFile.println (”Dette er en test” + 5); outFile.close(); Hvad med undtagelsen IOException der skal behandles eller kastes? Se eksempel på næste slide …
Skrivning til tekstfil i Java - eksempel • TestData.java side 547 i L&L i BlueJ • Tilføj ”header” og ”footer”
I/O – opsamling • Forsimplet fremstilling • Generelt mere kompliceret • Parsere • Binære filer • ... • Langt flere muligheder i Java
Static-begrebet … • Nogen spørgsmål ?