FK:P VT2004 Föreläsningsbilder F1

30
F1: 1 FK:P VT2004 Föreläsningsbilder F1 En inledning till Java och OOP

description

FK:P VT2004 Föreläsningsbilder F1. En inledning till Java och OOP. Några aspekter på ett nytt språk. exekveringsmiljö (”nativ” kod eller interpretering m.m.) historik och designprinciper (varför språket ser ut som det gör) syntax för grundspråket (primitiva datatyper, satser osv) - PowerPoint PPT Presentation

Transcript of FK:P VT2004 Föreläsningsbilder F1

Page 1: FK:P VT2004 Föreläsningsbilder F1

F1: 1

FK:P VT2004Föreläsningsbilder F1

En inledning till Java och OOP

Page 2: FK:P VT2004 Föreläsningsbilder F1

F1: 2

Några aspekter på ett nytt språk

• exekveringsmiljö (”nativ” kod eller interpretering m.m.)

• historik och designprinciper (varför språket ser ut som det gör)

• syntax för grundspråket (primitiva datatyper, satser osv)

• abstraktionsmekanismer (t.ex. egna datatyper, procedurer och funktioner i Pascal, klasser och metoder mm i Java)

• standardbibliotek av färdiga programkomponenter

• standardverktyg för programutveckling (programmeringsmiljön: kompilatorer, texteditorer, debuggers, dokumentationsverktyg, programgeneratorer m.m.)

Page 3: FK:P VT2004 Föreläsningsbilder F1

F1: 3

Java

• utformad 1991 av James Gossling vid Sun Microsystems under namnet Oak• tänkt från början för programmering av elektroniska hemapparater i nätverk• höga krav på

• flyttbarhet (skall kunna köras på olika processorer)• driftsäkerhet (möjlighet att fånga upp och åtgärda felvid exekvering)• säkerhet (möjlighet att begränsa programmets verksamhet)• förberedelse för nedladdning över ett nät• förberedelse för kommunikation över ett nät mellan samverkande program• parallellt exekverande processer (”trådar”)

• omvandlad 1995 till Java och anpassad till programmering av tillämpningar förWorldWideWeb, bl.a. omfattande stöd för grafik och animering

• utkommit sedan dess i flera versioner (1.0, 1.1, 1.2, 1.3, nuv. 1.4 och snart 1.5)• objektorienterat språk

Page 4: FK:P VT2004 Föreläsningsbilder F1

F1: 4

Java: kompilering och interpretering

Källkod i Java

Prog.javaJavakompilatorn

javac

Programmet ibytecode

Prog.class

Java VirtualMachine

En webbläsare

Interpreteras av

Exekveras på aktuell dator

Kompileras av

Page 5: FK:P VT2004 Föreläsningsbilder F1

F1: 5

Program i konventionella språk

Källkodi Pascal

Kompilatorför Windows

Objektkodför Windows

Rutinerför Windows

Länkareför Windows

Exekverbartprogramför Windows

Kompilatorför Macintosh

Objektkodför Macintosh

Rutinerför Macintosh

Länkareför Macintosh

Exekverbartprogramför Macintosh

Page 6: FK:P VT2004 Föreläsningsbilder F1

F1: 6

Program i Java

Källkodi Java

Java-kompilator

class-fili bytekod

class-fili bytekod

Java VirtualMachine

för Windows

Java VirtualMachine

för Macintosh

Andra klasser

Page 7: FK:P VT2004 Föreläsningsbilder F1

F1: 7

Kortfattad språkhistoriaFortran

Algol

CPascal

Ada

Ada95

C++

Java

1960

1970

1980

1990

2000

D. RitchieSystemprogrammeringLågnivåmekanismer

J. Ichbiah (DOD)Modularitet,

Objekt-baserad prog,Genericitet, Parallellitet,

Undantagshant.

N. Wirth+ poster,pekare mm

A. Key (Xerox PARC)

... samt OOP

C#

B. StroustrupLågnivåmek.,OBP, OOP,Genericitet,Undantagshant.

(MS)

J. Gossling(Sun)OOPParallellitetUndantagshant.

(IBM)

Smalltalk

O-J. Dahl, K. Nygaard(Norsk Regnesentral) OOP

Simula

Generic Java

Blockstruktur (lokala variabler),procedurer, funktioner, parametrar,datatyper, arrayer

Java 1.5... samt genericitet

Page 8: FK:P VT2004 Föreläsningsbilder F1

F1: 8

Den C-aktiga syntaxenKorthugget språk:

{ } istället för BEGIN ENDinga ”onödiga” ord som PROCEDURE, FUNCTION, THEN osvint[] arr; istället för arr: ARRAY[1..10] OF Integer;i = 0; istället för i := 0;&& resp. || istället för AND resp. OR

Vissa saker kan göras på flera olika sätt, t.ex. öka värdet i variabeln i med 1:i = i + 1; eller i += 1; eller ++i;

Uttryck kan användas som satser, funktioner kan anropas som procedurer:++i;j = ++i;summa(arr); // Returvärdet ignoreras, meningslöst här men tillåtet

Page 9: FK:P VT2004 Föreläsningsbilder F1

F1: 9

Snabb syntaxjämförelse: Pascal ...

PROCEDURE skriv(arr:arrtyp);VAR i : Integer;BEGIN FOR i:=1 TO 10 DO Write(arr[i]); Writeln;END; { las }

FUNCTION summa(arr:arrtyp):Integer;VAR i, sum : Integer;BEGIN sum:=0; FOR i:=1 TO 10 DO sum := sum + arr[i]; summa:=sum;END; { summa }

TYPE arrtyp = ARRAY [1..10] OF Integer;

int summa(int[] arr){ int sum=0; for (int i = 0; i < 10; ++i) sum += arr[i]; return sum;} // summa

void skriv(int[] arr){ for (int i = 0; i < 10; ++i) System.out.print(arr[i]); System.out.println();} // summa

... kontra Java

Page 10: FK:P VT2004 Föreläsningsbilder F1

F1: 10

Den största skillnaden: OOPJava är ett objektorienterat språk.Objektorientering allmänt:

verkligheten består av objekt som kan ha tillstånd och beteende,vissa objekt är av samma typ (klass), objekten kan ha olika relationer med varandra,klasser kan ha olika relationer med varandra (is-a, has-a)

Objektorienterad analys (OOA):analysera (beskrivningen av) en verksamhet med avseende på vilkatyper av objekt som förekommer och vilka operationer som utförs på dem

Objektorienterad design (OOD):utforma en systemarkitektur bestående av klasser med angivna relationermellan klasserna och operationer som skall kunna utföras på objekt av dessaklasser

Objektorienterad programmering (OOP):program byggs upp som en samling samarbetande objekt av klasser medväldefinierade gränssnitt (operationer) och relationer. Varje klass utgören byggkloss som kan användas i flera program.

En objektorienterad systemarkitektur kan lätt översättas till ett program i ettobjektorienterat programmeringsspråk, men OOP handlar även om mer konstruktionstekniska aspekter (t.ex. återanvändbara programkomponenter)

Hmm..slarvigadefinitioner

Page 11: FK:P VT2004 Föreläsningsbilder F1

F1: 11

Topologin hos ett Pascalprogram

Data

Subrutin Subrutin

Subrutin

Huvudprogram

Centralt (globalt) lagrade datasom (kan) bearbetas av alla delarav programmet.

Vid ändringar av datastrukturenkan alla delar av programmetpåverkas

Felaktigheter kan propagerasgenom programmet och ge sig tillkänna på ett helt annat ställe ändär de uppkommer - försvåradfelsökning och korrigering

(eller program i något annat imperativt språk)

Page 12: FK:P VT2004 Föreläsningsbilder F1

F1: 12

Topologin hos ett modulärt program

Modul Modul

Modul

Huvudprogram

Modul

Självständiga, separatkompilerade modulersom kommunicerar genomväldefinierade gränssnitt

Modulgränssnitt uttrycktai termer av abstrakta tjänster.

Data som behövs för att implementera tjänsterna ochoperationer på dessa datainkapslade (encapsulated)i modulen. Data är gömda (oåtkomliga)för andra moduler.

Page 13: FK:P VT2004 Föreläsningsbilder F1

F1: 13

Exempel: användning av Javas bibliotekimport javax.swing.*;import java.awt.*;class Anteckning extends JFrame{ Anteckning(){

super("Anteckning");JTextArea text = new JTextArea();getContentPane().add(text, BorderLayout.CENTER);setSize(300, 200);show();

} public static void main(String[] args){

new Anteckning(); }}

Detta korta program skaparett fönster med där användarenhar fullständig inmatnings-och editeringsfunktionalitet.

Page 14: FK:P VT2004 Föreläsningsbilder F1

F1: 14

API-beskrivningarAnvändning av sådana komponenter ur biblioteket kräver mycket sökningi beskrivningar av dessa komponenter efter vilka komponenter som finns,vilka operationer de har och hur man använder dem.

På föreläsningar och lektioner hinner vi endast tipsa om de viktigastekomponenterna och deras struktur, detaljer måste inhämtas på egenhand från läroböcker men främst från de webbaserade API-beskrivningarna.Detta gäller främst den senare delen av kursen.

Dessvärre kräver vissa enkla operationer också användning av komponenter.T.ex. ett program som läser in en sträng från terminalfönstret och skriver ut den igen:

import java.io.*;class Hej{ public static void main(String[] args) throws IOException{ BufferedReader input=new BufferedReader( new InputStreamReader(System.in)); System.out.print(”Vad heter du? ”); String namn = input.readLine(); System.out.println(”Hej, ” + namn); }}

Page 15: FK:P VT2004 Föreläsningsbilder F1

F1: 15

Orientering om OOP: ett fånigt exempelSäg att vi skall (börja) skriva det välkända Igelkottsprogrammet.

Programmet skall hantera igelkottar som har namn, ett antal taggar och somkan bli platta (av att ha blivit överkörda). En platt igelkott har inga taggar.

Det man vill kunna göra med en igelkott är att få fram dess namn, dess antal taggaroch om den är platt. Man skall även kunna köra över en igelkott.

Man skall inte kunna ändra igelkottens namn.Antalet taggar och plattheten kan man bara ändra genom att köra över igelkotten.

”Igge”85false

getNamn

getTaggar

Igelkott

bliPåkörd

ärPlatt

Page 16: FK:P VT2004 Föreläsningsbilder F1

F1: 16

Klasser och objekt

”Igge”85false

getNamn

getTaggar

Igelkott”Doris”0true

getNamn

getTaggar

Igelkott

namnantalTaggarplatt

getNamn

getTaggar

Igelkott

KlassTyp

Skrivs i källkoden

ObjektInstanserFörekomsterVärden

Skapas dynamiskt videxekvering

bliPåkörd

ärPlatt

bliPåkörd

ärPlatt

bliPåkörd

ärPlatt

Page 17: FK:P VT2004 Föreläsningsbilder F1

F1: 17

Koden för klassen Igelkottpublic class Igelkott{ private String namn; private int antalTaggar; private boolean platt; public Igelkott(String n, int at){

namn = n;antalTaggar = at;platt = false;

} public String getNamn() {

return namn; } public int getTaggar() {

return antalTaggar; } public boolean ärPlatt() {

return platt; } public void bliPåkörd() {

antalTaggar = 0;platt = true;

} public String toString(){

return namn + ” har ” + antalTaggar + ” taggar”; }}

Data markerade som privata

”Konstruktor” somanger hur objekt skall initieras

”Metoder” (dvs procedurereller funktioner) somanger operationer påett igelkottobjekt

Page 18: FK:P VT2004 Föreläsningsbilder F1

F1: 18

Användning av klassen IgelkottKlassen Igelkott läggs på filen Igelkott.java och kompileras för sig.Detta resulterar i en fil Igelkott.class med den kompilerade bytekoden.

Nu kan man skriva en annan klass som kan använda klassen Igelkott:

public class AnnanKlass{ private Igelkott ig1, ig2;

public void någonMetod(){ ig1 = new Igelkott(”Igge”, 85); ig2 = new Igelkott(”Doris”, 37);

String str = ig1.getNamn(); int antal = ig2.getTaggar();

ig2.bliPåkörd(); ... }

}

Klassnamnet Igelkott används som typnamn för deklaration av ”pekarvariabler” till Igelkott-objekt.Igelkott-objekt skapas dynamiskt med new.Vid skapande utförs objektens konstruktor,man måste ange värden för dess parametrar.

Page 19: FK:P VT2004 Föreläsningsbilder F1

F1: 19

Klasser och objekt igen

ig2ig1

någonMetod

AnnanKlassnamnantalTaggarplatt

getNamn

getTaggar

bliPåkörd

ärPlatt

Igelkott

”Igge”85false

getNamn

getTaggar

Igelkott”Doris”0true

getNamn

getTaggar

Igelkott

bliPåkörd

ärPlatt

bliPåkörd

ärPlatt

ig2ig1

någonMetod

AnnanKlass

Page 20: FK:P VT2004 Föreläsningsbilder F1

F1: 20

Klasser kontra poster (RECORDs)Det finns en stor likhet mellan klasser och poster.

Både klassobjekt och postförekomster innehåller värden på namngivnaattribut (termer, variabler).

Den stora skillnaden ligger i att klasser även innehåller operationer (metoder)som kan anropas från utanför klassen för att t.ex. förändra värden hos det objekt de anropas hos eller avläsa dessa värden.

Man brukar säga att ett objekt har ett tillstånd representerat av värden på dessvariabler (t.ex. namn, antalTaggar och platt) och ett beteende representerat avdess metoder (t.ex. kan våra igelkottar tillfrågas om deras namn, antal taggar och om de är platta, och de kan bli påkörda).

En annan viktig skillnad är att man kan gömma den inre implementeringenav en klass genom att deklarera den som privat - andra klasser kan dåendast använda de publika metoderna för att ändra eller avläsa tillståndet.På detta sätt kan man garantera att objekt av klassen beter sig korrekt.

T.ex. kan man inte ändra namn på våra igelkottar. Man kan inte heller ändraderas antal taggar utan att köra på dem, och då blir de samtidigt platta.Vi har alltså skapat en ny datatyp med bestämda operationer.

Page 21: FK:P VT2004 Föreläsningsbilder F1

F1: 21

Mer om klasser och objekt

I Java finns det några primitiva datatyper som int, boolean, char, double (motsv. Real) m.fl. Allt annat är dock klasser, t.ex. String, Date och tusentals andra.

I ett Java-program måste varje sats ligga inom någon metod, och varje metodmåste ligga inom någon klass.

Av en anledning som vi återkommer till kan man endast skapa objekt dynamiskt under exekveringen (liknande Pascals New) och de kan bara hanteras via ”pekare”.Dock har dessa ”pekare” ett mer disciplinerat beteende än pekare i Pascal ochde kallas därför ”referenser” - man får inte kalla dem pekare.

Det finns ingen motsvarighet till Pascals Dispose. Istället tas objekten bortautomatiskt när det inte längre finns någon referens som refererar till dem (automatisk skräpsamling - garbage collection).

Page 22: FK:P VT2004 Föreläsningsbilder F1

F1: 22

Krav på generalitetEftersom de flesta klasser ska kunna användas av flera tillämpningsprogram måste de utformas någorlunda generellt så att de inte bestämmer alltför mycket för tillämpningarna.

Exempel på ett par enkla sådana krav på återanvändbara klasser är:

• man skriver inte ut felmeddelanden i klassen - man vet ju inte hur tillämpningenvill hantera felet. Man försöker rapportera felet till tillämpningsprogrammet, intetill användaren

• man skriver inte ut data, istället skapar man strängar som tillämpningar kan skrivaut där de vill ha utskrifterna

•man läser inte in data, istället tar man emot strängar som man försöker tolka,så tillämpningar kan läsa in strängen på det sätt de vill

Page 23: FK:P VT2004 Föreläsningsbilder F1

F1: 23

Vem börjar skapa objekten?

Om klasser bara är typbeskrivningar och det finns inget annat än klasser,vem är det som skapar det första objektet?

Det måste finnas något som ”finns från början”, innan det finns några objekt.

Man kan deklarera metoder (och även variabler) som finns i en enda uppsättning oberoende av objekten. De måste dock fortfarande finnas i någon klass.De kallas för klassmetoder resp. -variabler.I Java deklareras de med ordet static (”statiska” metoder resp. variabler)

ig2ig1

någonMetod

AnnanKlassnamnantalTaggarplatt

getNamn

getTaggar

bliPåkörd

ärPlatt

Igelkott

Page 24: FK:P VT2004 Föreläsningsbilder F1

F1: 24

Den ”statiska” metoden main

main

TestProg

class TestProg{ public static void main(.....){ AnnanKlass ak = new AnnanKlass(); ak.någonMetod(); .... } // main} // TestProg

ig2ig1

någonMetod

AnnanKlassnamnantalTaggarplatt

getNamn

getTaggar

bliPåkörd

ärPlatt

Igelkott

Motsvarigheten till etthuvudprogram måstevara en statisk metodmed namnet main (ochvissa andra egenskaper).Javas interpretatoranropar denna metodnär exekveringen startar,i denna metod kan manbörja skapa objekt osv

Page 25: FK:P VT2004 Föreläsningsbilder F1

F1: 25

Instans- kontra klass- variabler/metoderDet vanliga är att varje objekt av en klass har sin egen uppsättning variabler ochmetoder. De kallas då instans-variabler resp. -metoder.

Ibland händer det dock att man behöver någon variabel som alla objekt skall delapå och som skall finnas även om det inte finns något objekt av klassen.Det händer också att man behöver någon metod som hör till klassen men intebehöver operera på objektens data och skall finnas oberoende av objekten(se exempel på nästa bild).

Man kan då skapa en klassvariabel resp. klassmetod i klassen genom att deklarerade ordet static.

Page 26: FK:P VT2004 Föreläsningsbilder F1

F1: 26

Klassvariabler och -metoder

ig1

class Igelkott{ private static int antal=0; private String namn; ... public Igelkott(String n){ ++antal;

namn = n;....

} public String getNamn(){ return namn; } public static int getAntal(){ return antal; }}

namnantal

getNamn

getTaggargetAntal

Igelkott

1

”Igge”

getNamn

Igelkott

Anrop enligt: String str = ig1.getNamn(); men: int ant = Igelkott.getAntal();

Page 27: FK:P VT2004 Föreläsningsbilder F1

F1: 27

Objekt av samma men ändå olika typ

äter

springer

Häst

Säg att vi behöver ett program som hanterar djur av olika typer:• alla djur kan äta och låta (ge läten)• hästar kan springa• kor kan ge mjölk• fiskar kan simma och ”låter” annorlunda än alla andra djur

låter

äter

Ko

låter

gerMjölk

äter

simmar

låter

Fisk

Page 28: FK:P VT2004 Föreläsningsbilder F1

F1: 28

Klasshierarkier, arv

äter

låter

Djur

springer

Häst

gerMjölk

Ko

Häst

äter

låter

springer

Djur

simmar

Fisk

låter

Häst

Häst

äter

låter

gerMjölk

Djur

Ko

Fisk

äter

låter

simmar

Djur

Fisk

låter

Page 29: FK:P VT2004 Föreläsningsbilder F1

F1: 29

Klasshierarkier, arvKlasser kan ordnas i en hierarkisk struktur, med den mest generella klasseni toppen (klassen Djur i exemplet). Klasser på lägre nivåer (subklasser)sägs ärva från klasser på högre nivåer (superklasser).

Subklasserna får alla de egenskaper som finns deklarerade i superklassernaoch kan lägga till sina egna egenskaper.

Dessutom kan subklasserna omdefiniera metoder från superklasserna - klassen Fisk har definierat om metoden låter. Detta kallas ”överskuggning”av superklassens metoder.

En referens deklarerad som Djur kan nu referera till objekt av antingenklassen Häst, Ko eller Fisk. Om vi har referensen Djur doch anropet

d.låter();så går det inte att avgöra genom att titta på denna sats vilken metod låtersom kommer att anropas. Metoden bestäms vid anropsögonblicket beroendepå vilket objekt d råkar referera till då. Mekanismen kallas ”dynamiskbindning”, möjligheten att med en sats kunna anropa olika metoder vidolika tillfällen brukar kallas ”polymorfism”.

Det utgör den viktigaste mekanismen inom objektorienterad programmering.

Page 30: FK:P VT2004 Föreläsningsbilder F1

F1: 30

Konsekvenser av OOP

Genom att varje klass är en självständig, separatkompilerad modul kan manskapa bibliotek av återanvändbara programkomponenter och bygga tillämpningsprogram av dessa byggklossar.

Genom användning av polymorfism kan man även anpassa beteendet hos dessabyggklossar till varje tillämpnings önskemål.

I Javas klassbibliotek finns det återanvändbara klasser för olika typer avdatasamlingar (länkade listor, binära sökträd osv, sorterade och osorterade),komponenter för grafiska användargränssnitt och hela färdiga applikationsramverksom bara behöver fyllas i med innehållet i den aktuella tillämpningen.