LB1379 - Java SE 6 - Foundation - Crash course for DBC

Page 1

Java Crash Course

Java Crash Course Copyright Š Lund&Bendsen A/S

1


Om underviseren • Jesper Tejlgaard Pedersen – – – –

Cand.polyt fra Danmarks Tekniske Universitet Konsulent og instruktør indenfor Java og Java EE. Email: jesper@lundogbendsen.dk linkedin.com/in/jespertejlgaard

• Specialist i Java og Java EE • Lund&Bendsens Web specialist Java Crash Course Copyright © Lund&Bendsen A/S

2


Java Crash Course • • • • • • • • • •

Objektorienteret programmering med Java Komposition, arv og polymorfi Synlighedsregler Arrays & Collections if-else, switch, while- og for-løkker Exceptions Enumerations Generics Annotationer Nestede klasser Java Crash Course Copyright © Lund&Bendsen A/S

3


OOP terminologi Objekter (Instans)

Klasser (Type)

Den brune gravhund der hedder ”Emma”

Firbenede be-pelsede pattedyr kaldet hunde

Rasmus’ metalblå Toyota Corolla Stw.

Fartøjer med fire hjul, motor osv. kaldet biler

En bestemt web-url: URL’er som angiver en www.lundogbendsen.dk hjemmeside-adresse Java Crash Course Copyright © Lund&Bendsen A/S

4


OOP terminologi Klasse OID Bog Bog Person Person

Objekt-tilstand

11

ISBN=1-56592-487-8 Title=Java In a Nutshell 3rd edition

38

ISBN=1-56592-487-8 Title=Java In a Nutshell 3rd edition

26

Name=Rasmus Lund BirthYear=1973

98

Name=Rasmus Jensen BirthYear=1973

Java Crash Course Copyright Š Lund&Bendsen A/S

samme tilstand

forskellig tilstand

5


Basale Java-instruktioner til OOP ResumĂŠ: Hvad er hvad her?

Car car01 Reference variabel

=

new Car();

tildelingsoperation

Objekt instantiering

Java Crash Course Copyright Š Lund&Bendsen A/S

6


Basale Java-instruktioner til OOP Flere reference-variable kan ’pege’ på samme objekt på samme tid.

Car car01 = new Car(); car01

Car car02 = car01; Car car03 = car02;

car01 car02 car03

Java Crash Course Copyright © Lund&Bendsen A/S

7


Basale Java-instruktioner til OOP I virkeligheden kopierer Java bare reference-variablernes oid’er. oid=12

Car car01 = new Car();

Car car02 = car01; Car car03 = car02;

car01

12

car01

12

car02

12

car03

12

Java Crash Course Copyright Š Lund&Bendsen A/S

oid=12

8


Basale Java-instruktioner til OOP Man kan bruge en reference-variabel til et objekt, hvis man vil ændre på objektets tilstand (idet tilstanden udgøres af navngivne variable i objektet). Dette gøres vha. dot-operatoren. Keyword’et null betyder ”ingenting”. Car car01 = new Car(); car01 car01.running = true; car01 car01.direction = 1; car01 car01 = null; car01 Java Crash Course Copyright © Lund&Bendsen A/S

9


Objekters adfĂŚrd I Java sender man en besked vha. dot-notation og metodekald Reference_til_objekt.Metode_navn(Argumenter); Car car01 = new Car(); car01 car01.startEngine(); car01 car01.turnRight();

car01.moveForward(1);

car01

Wrrm.. car01 Java Crash Course Copyright Š Lund&Bendsen A/S

10


Felter i klasser I en klasse kan man angive, hvilke felter dens instanser (objekter) skal have – disse erklæres som almindelige variable direkte i klassens body. public class Car{ String ownerName; int numberOfWheels; int seats = 5; } Angiver man ikke en værdi får felterne en standard-værdi, som fx er null for referencetyper, og 0 for heltal (int).

... Car car1 = new Car(); car1.ownerName = ”Ib”; car1.numberOfWheels = 4; if( car1.seats == 5 ){ print( ”Has default” ); print( ”no of seats” ); } ... Java Crash Course Copyright © Lund&Bendsen A/S

11


Objekters adfærd Hvorfor sende beskeder frem for at ændre direkte i et objekts felter? Skal overskue og forstå de mange kodelinier, der implementerer bilers funktionalitet

Programmør

usynligt implementation

Skal ”bare” kende de metoder bil-objekter tilbyder og hvad effekt man får, når man kalder dem

synligt

Kollega

grænseflade Java Crash Course Copyright © Lund&Bendsen A/S

12


Definition af metoder i Java Metoder placeres altid i en klasses body: Klasse-body

Metode-bodies

public class Car { public void turnLeft(){ // koden der skal køres, // når metoden kaldes } public void moveForward ( int howFar ){ // koden der skal køres, // når metoden kaldes } } Java Crash Course Copyright © Lund&Bendsen A/S

13


Den underforståede ”variabel” this Ligesom vi kan tilgå et felt vha. reference_navn.felt_navn, kan man også tilgå et objekts felter vha. this.felt_navn. Eksempel: public class Car{ int speed = 0; void increaseSpeed( int howMuch ){ this.speed = this.speed + howMuch; } } Car myCar = new Car(); myCar.increaseSpeed( 10 ); Det samme gælder for metoder Java Crash Course Copyright © Lund&Bendsen A/S

14


Overloading af metoder Man kan overloade metoder, dvs. lave flere metoder med samme navn, men forskellige parameterlister. Metodens navn + typerne i parameterlisten skal være unik indenfor klassen og kaldes for metodens signatur. public class Car{ int creationYear;

Kun forskellige mht. parametre

public int getAge( ){ return currentYear() - creationYear; } public int getAge( int atYear ){ return atYear – creationYear; } } Samme effekt kunne opnås med: return this.getAge( currentYear() ); Java Crash Course Copyright © Lund&Bendsen A/S

15


toString-metoden Man kan erklære en speciel metode i sine klasser, som gør det muligt for objekter at lave sig selv om til en streng, der beskriver objektet. Car c = new Car( ); c.make = ”Ford”; c.creationYear = 1998; String s = c.toString();

public class Car{ String make; int creationYear; ... s er ”Car[Ford made 1998]” public String toString(){ String result = ””; result += ”Car[” + this.make; // Car[Ford result += ” made ” + creationYear + ”]”; // made 1998] return result; } } Java Crash Course Copyright © Lund&Bendsen A/S

16


Hvad er en constructor? En constructor er en slags metode, der automatisk kaldes hver gang man laver en ny instans af en klasse. Laver man fx et Car -object: Car car = new Car( );

Bliver der kaldt en constructor i klassen Car, der ser ud som følger: public class Car{ public Car( ){ … } }

Returtype Car er underforstået for Car-constructors

Java Crash Course Copyright © Lund&Bendsen A/S

17


Et eksempel på en constructor Constructors bruges ofte til at initialisere et objekt med. Dvs. give dets felter start-værdier på en nem måde. Fx public class Car{ Samme navn!!! int maxSpeed; String make; public Car( int maxSpeed, String make ){ this.maxSpeed = maxSpeed; this.make = make; } }

Java Crash Course Copyright © Lund&Bendsen A/S

18


Eksempel på constructor-overloading Man kan have flere constructors, når blot de differentierer sig på antal og/eller typen af parametre (som ved metoder). public class Car{ Forskellige mht. parametre int maxSpeed; String make; public Car( int maxSpeed, String make ){ this.maxSpeed = maxSpeed; this.make = make; } public Car( int maxSpeed ){ this.maxSpeed = maxSpeed; } public Car( ){ new Car( 120, "Ford" ); } new Car( 230 ); } new Car( ); Java Crash Course Copyright © Lund&Bendsen A/S

19


Kald af andre constructors Overloadede constructors kan kalde hinanden: public class Car{ int maxSpeed; String make; public Car( int maxSpeed, String make ){ this.maxSpeed = maxSpeed; this.make = make; } kalder public Car( int maxSpeed ){ this( maxSpeed, ”UNKNOWN” ); } new Car( 120, "Ford" ); public Car( ){ new Car( 230 ); this( 0 ); kalder new Car( ); } }

Det er kun constructors, der må kalde andre constructors med ’this’! Java Crash Course Copyright © Lund&Bendsen A/S

20


Java Crash Course • • • • • • • • • •

Objektorienteret programmering med Java Komposition, arv og polymorfi Synlighedsregler Arrays & Collections if-else, switch, while- og for-løkker Exceptions Enumerations Generics Annotationer Nestede klasser Java Crash Course Copyright © Lund&Bendsen A/S

21


Brug af komposition • Man laver komposition ved at lade hver instans af NewClass have en hjælpe-instans af OldClass (1) • Man kan nu: – genbruge de metoder man ønsker, ved at lave tilsvarende metoder i NewClass, som delegerer videre til OldClass (2) – ditto, men med andre metodenavne end dem i OldClass (3) – tilføje ekstra helt nye metoder i klassen NewClass (4)

• Man siger NewClass har en OldClass (has-an). class NewClass{ private OldClass c; void o1(){c.o1;} void n3(){c.o3;} void n4(){...} (4) }

(1) (2) (3)

class OldClass{ void o1(){...} void o2(){...} void o3(){...} } Java Crash Course Copyright © Lund&Bendsen A/S

22


Hvad er nedarvning? (3/3) instans af A

A variableA methodA( )

variableA methodA( )

variableA variableB

B variableB methodB( )

C variableC methodC( )

instans af B

methodA( ) methodB( )

class A{…} class B extends A{…} class C extends B{…} Java Crash Course Copyright © Lund&Bendsen A/S

instans af C

variableA variableB variableC methodA( ) methodB( ) methodC( ) 23


Ingen multipel nedarvning i Java I Java kan en klasse kun arve fra ĂŠn anden klasse (i C++ fx er multipel nedarvning lovligt) A

B

C

B

A

C

Java Crash Course Copyright Š Lund&Bendsen A/S

24


Hvad er en abstrakt metode? • En abstrakt metode, er en metode, der ikke har nogen metodekrop. • Tanken med en abstrakt metode er, at en subklasse overrider metoden og dermed giver den en implementation. • Metoden skal defineres med modifieren abstract public abstract void myMethod (); abstract int anotherMethod (int a, int b); public abstract void myMethod () throws IOException; Java Crash Course Copyright © Lund&Bendsen A/S

25


Abstrakte klasser • Når man laver en abstrakt metode, skal klassen hvori metoden står også være abstrakt (brug keyword’et abstract). • Og en klasse, der arver fra en abstrakt klasse: – skal enten: selv være abstrakt – eller: override alle nedarvede abstrakte metoder

abstract class MyClass { public abstract void myMethod (); } Java Crash Course Copyright © Lund&Bendsen A/S

26


Interfaces Man kan angive et interface og implementationen af dette på følgende måde public interface HasArea { static public final double PI = 3.14; public double calculateArea ( ); } class Rectangle implements HasArea{ int height, width; public double calculateArea(){ return height * width; // klassen implementerer metoden!! } }

Java Crash Course Copyright © Lund&Bendsen A/S

27


Eksempler på ”multiple supertyper” <<abstract>>

Java Crash Course Copyright © Lund&Bendsen A/S

28


Java Crash Course • • • • • • • • • •

Objektorienteret programmering med Java Komposition, arv og polymorfi Synlighedsregler Arrays & Collections if-else, switch, while- og for-løkker Exceptions Enumerations Generics Annotationer Nestede klasser Java Crash Course Copyright © Lund&Bendsen A/S

29


Synligheds-modifiers 1/4 package p package p; class V { private int a; int b; protected int c; public int d; }

package p; class X { Kode, der står i klassen selv, kan se alt – dvs. members der er: } • private • <default> • protected • public package q

package q; class Y extends V {

package q; class Z {

}

} Java Crash Course Copyright © Lund&Bendsen A/S

30


Synligheds-modifiers 2/4 package p package p; class V { private int a; int b; protected int c; public int d; }

package p; class X { }

Kode, der står i en anden klasse, men i samme pakke kan se:

package q; class Y extends V { }

• <default> • protected package q; • public class Z {

package q

} Java Crash Course Copyright © Lund&Bendsen A/S

31


Synligheds-modifiers 3/4 package p package p; class V { private int a; int b; protected int c; public int d; }

package p; class X { } Kode, der står i en anden klasse, som er i en anden pakke og som nedarver fra klassen den tilgår, kan se: • protected • public

package q; class Y extends V {

package q; class Z {

}

} Java Crash Course Copyright © Lund&Bendsen A/S

package q

32


Synligheds-modifiers 4/4 package p package p; class V { private int a; int b; protected int c; public int d; }

Kode, der står i en anden package p; klasse og som class er i en anden X {pakke og som ikke nedarver fra klassen den tilgår, } kan se: • public

package q package q; class Y extends V {

package q; class Z {

}

} Java Crash Course Copyright © Lund&Bendsen A/S

33


Resumé over hvad der er synligt?

Designer

Private felter Private metoder Private constructors Alle metode-kroppe Alle constructor-kroppe Static- og instans-initializers

Bruger Public felter Public metode-erklæringer Public constructor-erklæringer

Implementation / realisering

Grænseflade / interface

<default> og protected felter, constructors og metoder Java Crash Course Copyright © Lund&Bendsen A/S

34


Java Crash Course • • • • • • • • • •

Objektorienteret programmering med Java Komposition, arv og polymorfi Synlighedsregler Arrays & Collections if-else, switch, while- og for-løkker Exceptions Enumerations Generics Annotationer Nestede klasser Java Crash Course Copyright © Lund&Bendsen A/S

35


Erklæring af Arrays Et eksempel på anvendelsen af arrays: public class ArrayTest { public static void main(String[] args) { int[] måneder = new int[12]; måneder[0]=31; måneder[1]=28; måneder[2]=31; måneder[3]=30; måneder[4]=31; måneder[5]=30; måneder[6]=31; måneder[7]=31; måneder[8]=30; måneder[9]=31; måneder[10]=30; måneder[11]=31; System.out.println("Længden af januar er: " + måneder[0]); System.out.println("Længden af april er: " + måneder[3]); } }

NB: Her kunne man have lavet et array med størrelsen 13 og ignoreret plads 0. Pointen skulle være, at vi fx kunne bruge index = 1 om januar (i stedet for 0 som vist) Java Crash Course Copyright © Lund&Bendsen A/S

36


Initialisering af Arrays Vi kan oprette et array og initialisere det med fastlagte værdier på følgende måde: int[] måneder = {31,28,31,30,31,30,31,31,30,31,30,31};

Eller int[] måneder = new int[] {31,28,31,30,31,30,31,31,30,31,30,31};

Et array af Strings kan laves således: String[] måneder =

{"januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"};

Java Crash Course Copyright © Lund&Bendsen A/S

37


Syntaksen for enhanced for loop eller et array

Syntaks (læs kolon som ’in’): for (ElementType currentElement : iterable) { // use currentElement } fx et array af Persons For eksempel: for (Person currentPerson : persons) { System.out.println (currentPerson.getName()); } Java Crash Course Copyright © Lund&Bendsen A/S

38


Hvorfor skal vi forstå Collections? De forskellige typer af collections har forskellige egenskaber: – performer godt til forskellige opgaver (søgning, sortering, opslag), – har helt forskellige evner - nogle kan noget andre ikke kan (f.eks. at finde elementer efter indeksværdi)

Java Crash Course Copyright © Lund&Bendsen A/S

39


Om at vælge en Collection-type Der er mange punkter man bør overveje, inden man vælger Collectiontype - fx: – – – – – – – –

skal det være effektivt at søge efter ét bestemt element i samlingen? skal elementerne kunne tilgås i vilkårlig rækkefølge (fx via indeks)? gennemløbes elementerne altid sekventielt? skal samlingen kunne huske en bestemt rækkefølge på elementerne? skal samlingen tillade flere kopier af samme element? skal samlingen sikre, at der ikke indsættes to ens elementer? skal det være hurtigt at indsætte og slette elementer i samlingen? skal samlingen kunne vokse og skrumpe dynamisk under brug? (fx har arrays fast størrelse, mens mange collections kan vokse og skrumpe). – gemmes elementerne sammen med en nøgle? (dvs. par af nøgle→element). – skal elementerne altid være sorteret / ordnet i en af os angivet rækkefølge? Java Crash Course Copyright © Lund&Bendsen A/S

40


Oversigt over Collection-API'et <interface> Iterable<E>

<interface> RandomAccess

<interface> Queue<E>

<interface> List<E>

interfaces

<interface> Deque<E>

klasser

ArrayDeque<E>

<interface> Set<E>

<interface> BlockingQueue<E>

<interface> BlockingDeque<E>

ArrayList<E>

<interface> Map<K,V>

<interface> Collection<E>

PriorityQueue<E>

<interface> SortedMap<K,V>

<interface> SortedSet<E>

<interface> NavigableSet<E>

HashSet<E>

LinkedList<E>

<interface> NavigableMap<K,V>

<interface> ConcurrentMap<K,V>

<interface> ConcurrentNavigableMap<K,V>

TreeSet<E>

HashMap<K,V>

WeakHashMap<K,V>

LinkedHashSet<E>

Java Crash Course Copyright Š Lund&Bendsen A/S

TreeMap<K,V>

IdentityHashMap<K,V>

LinkedHashMap<K,V>

41


Performance for Collections (1/3) Diagrammet viser, hvordan man inden for algoritmikken betegner forholdet mellem antal elementer i en datastruktur og den tid, det tager at lave operationer pĂĽ den. Tid O( n )

O( log(n) )

O( 1 ) Antal elementer

Java Crash Course Copyright Š Lund&Bendsen A/S

42


Performance for Collections (2/3) søgning

gennemgang

indsættelse

sletning

index-opslag

LinkedList

O( n )

O( n )

O( 1 )*

O( 1 )*

O( n )

Sorteret LinkedList

O( n )

O( n )

O( 1 )*

O( 1 )*

O( n )

ArrayList

O( n )

O( n )

O( n )

O( n )

O( 1 )

O( log(n) )

O( n )

O( n )

O( n )

O( 1 )

Hash…

O( 1 )

O( n )

O( 1 )

O( 1 )

-

Tree…

O( log(n) )

O( n )

O( log(n) )

O( log(n) )

-

Sorteret ArrayList

* Hvis vi først skal søge, for at finde hhv. indsættelsessted eller element til sletning, så: O( n ) Bemærk at tabellen ovenfor medtager sorterede LinkedList- og ArrayListsamlinger. Man kan nemt sortere en samling, der implementerer List-interfacet vha. Collections.sort()-metoden. Java Crash Course Copyright © Lund&Bendsen A/S

43


Java Crash Course • • • • • • • • • •

Objektorienteret programmering med Java Komposition, arv og polymorfi Synlighedsregler Arrays & Collections if-else, switch, while- og for-løkker Exceptions Enumerations Generics Annotationer Nestede klasser Java Crash Course Copyright © Lund&Bendsen A/S

44


Eksempel på if else syntaks if (pris > 1000){ System.out.println(”bogen er meget dyr."); } else if (pris >= 100) { System.out.println(”bogen er dyr."); } else if (pris < 25) { System.out.println(”bogen er MEGET billig."); } else if (pris == 0) { System.out.println(”bogen er gratis?."); } else { System.out.println(”bogen er billig."); }

Java Crash Course Copyright © Lund&Bendsen A/S

45


Switch-sætninger int number = 2; String nn; //number name switch (number) { case 1: nn = "one"; break; case 2: nn = "two"; break; case 3: nn = "three"; break; case 4: nn = "four"; break; default: nn = "0"; } System.out.println("The number is: " + nn);

number=? 1

2

3

4

!1..4

• Switch virker kun på (visse) primitive datatyper – char, byte, short og int (dvs. heltals-typerne) samt enums. • Det er ikke muligt at benytte andre sammenligninger end == • HUSK, (som hovedregel) at indsætte break-statements. Java Crash Course Copyright © Lund&Bendsen A/S

46


Switch-sætninger, fall-through • I visse tilfælde kan vi bevidst udelade break-statements.

static int monthLength(int month) { int lu; switch case case case case case case case

(month) { 1: //fall through 3: 5: 7: 8: 10: 12: lu=31; break; case 2: lu=28; break; case 4: //fall through case 6: case 9: case 11: lu=30; break; default: lu=0;

• Metoden til højre returnerer antallet af dage i en given måned, ved brug af switch uden breaks. • Det er dog ikke pæn kodestil! • Undlader man break med vilje plejer man at skrive en kommentar som følger: // fall-through

} return lu; } Java Crash Course Copyright © Lund&Bendsen A/S

47


Ternary if • Operatoren x?y:z giver os mulighed for at lave et betinget udtryk som del af en anden sætning: I have 1 apple int i=1; System.out.println("I have " + i + " apple" + (i==1 ? "" : "s") ); I have 2 apples int i=2; System.out.println("I have " + i + " apple" + (i==1 ? "" : "s") );

• String s = (i==1 ? ”A" : ”B"); betyder: hvis betingelsen (i==1) er sand, så sæt s=”A” ellers sæt s=”B”. • (<betingelse> ? <hvis true> : <hvis false> ) Java Crash Course Copyright © Lund&Bendsen A/S

48


While • While-løkker lader os udføre en kodeblok så længe en given betingelse er sand. public class WhileTest { public static void main(String[] args) { double sum = 0; int i = 1; while (i <= 10000) { sum = sum + 1.0/i; i = i + 1; } System.out.print("summen af 1/1...1/10000 er " + sum); } } summen af 1/1...1/10000 er 9.787606036044348

• Programmet udregner:

1 1 1 1 1 1 1 1 + + + + + + + ... + 1 2 3 4 5 6 7 10000

Java Crash Course Copyright © Lund&Bendsen A/S

49


Do...While Do...While-løkker lader os udføre en kodeblok mindst 1, evt. flere gange. public class DoWhileTest { public static void main(String[] args) { double sum = 0; int i = 1; do { sum = sum + 1.0/i; i = i + 1; } while (i <= 10000); System.out.print("summen af 1/1...1/10000 er " + sum); } } summen af 1/1...1/10000 er 9.787606036044348

Java Crash Course Copyright © Lund&Bendsen A/S

50


For-løkker • Ofte ønsker vi at gennemløbe nogle kodelinjer et foruddefineret antal gange. • For-løkker er specielt velegnede til dette, men de kan dog også bruges til andre ting. • Et eksempel på en for-løkke: public class ForTest { public static void main(String[] args) { for (int i = 0; i < 5; i++) { System.out.println("i er nu: " + i); } } }

Java Crash Course Copyright © Lund&Bendsen A/S

i i i i i

er er er er er

nu: nu: nu: nu: nu:

0 1 2 3 4

51


For-løkker • Syntaksdiagram for for-løkker: for

(

initialisering

;

betingelse

;

opdatering

)

kode

• Flowdiagram for for-løkker initialisering

betingelse

false

true

kode (kroppen af for-løkken) opdatering

Java Crash Course Copyright © Lund&Bendsen A/S

52


Java Crash Course • • • • • • • • • •

Objektorienteret programmering med Java Komposition, arv og polymorfi Synlighedsregler Arrays & Collections if-else, switch, while- og for-løkker Exceptions Enumerations Generics Annotationer Nestede klasser Java Crash Course Copyright © Lund&Bendsen A/S

53


Try-Catch • I Java kan man forsøge at gøre noget, som kan resultere i en fejl. • Og man kan angive hvad der skal ske, hvis fejlsituationen opstår. ... String myDateString = "20. juni 2004"; DateFormat df = DateFormat.getDateInstance(DateFormat.LONG); try{ // forsøg at gøre det her… Date futureDate = df.parse( myDateString ); System.out.println( futureDate ); } catch( ParseException e ){ // ved fejl – gør det her… String errMsg = "could not parse: "; errMsg += myDateString + " as date"; System.out.println( errMsg ); } ...

Java Crash Course Copyright © Lund&Bendsen A/S

54


Fejltyper i Java (7/8) Object Throwable

Exception

Error

RuntimeException •Checked exceptions •Skal håndteres

•Unchecked exceptions •Må håndteres

Java Crash Course Copyright © Lund&Bendsen A/S

55


Konstruktion af nye exception-typer 1. 2. 3. 4.

Lav en klasse, der nedarver fra Exception (eller RuntimeException) Pr. konvention navngives klassen, så den ender på 'Exception' Lav en tom constructor, der kalder den tomme superklasses constructor Lav evt. constructors svarende til de øvrige constructors i Exception-klassen, der alle kalder superklassens constructor. 2

1

public class NoSuchFileException extends Exception{ // Tom constructor 3 public NoSuchFileException(){ super(); } // Constructor der tager en String 4 public NoSuchFileException( String s ){ super( s ); } } Java Crash Course Copyright © Lund&Bendsen A/S

56


Kald af metoder der kan give fejl 7/8 Hvordan bærer metoden save sig ad med ikke at håndtere fejlen, men i stedet viderekaste den.

Save

Gui.saveAction( ) Vil du overskrive?

Document.save( ) Ja

Nej

FileHandler.save( text, fileName ) Java Crash Course Copyright © Lund&Bendsen A/S

57


Kald af metoder der kan give fejl class Document{ public void save(…){ try{ FileHandler.save(…); } catch( FileAlreadyExistException e ) { … } } Håndterer selv fejlen }

class Document{ public void save(…) throws FileAlreadyExistException { FileHandler.save(…); } Videresender fejlen } Java Crash Course Copyright © Lund&Bendsen A/S

58


Finally Et hyppigt anvendt eksempel på brugen af finally – nemlig til at lukke for åbne ressourcer og lignende: Socket s = null; try{ s = …; // open a socket … // use the socket } catch( IOException e ) { … } finally { if (s != null) { try { s.close(); } catch (IOException e) { // can’t do more than try } } }

Forsøg altid at lukke netværksforbindelsen efter brug – hvad enten der opstod fejl i trydelen eller ej.

to close

Java Crash Course Copyright © Lund&Bendsen A/S

59


Flere catch-blokke Exception IOException EOFException

void m() throws IOException{...} void p() throws EOFException{...} ... try{ m(); } catch(IOException e){ // køres } catch(Exception e ){ // køres ikke } finally{ // køres }

Java Crash Course Copyright © Lund&Bendsen A/S

60


Ignorér aldrig fejl • Hvis man konsumerer en fejl uden samtidigt at tage hånd om problemet, der var årsagen til fejlen, udelukker man sig selv for muligheden for at finde bugs. • Skriv ALDRIG en tom catch-blok: try { … } catch (Exception e) { } En bedre løsning er vist på næste slide… Java Crash Course Copyright © Lund&Bendsen A/S

61


Alternativ til at ignorere fejl Smid i det mindste en RuntimeException med det oprindelige fejlobjekt som parameter: try{ … } catch (Exception e) { throw new RuntimeException(e); }

Så ”bobler” fejlen i det mindste op… Java Crash Course Copyright © Lund&Bendsen A/S

62


Brug unchecked ex til korrekthedscheck Object Throwable

Exception

Error

RuntimeException •Checked exceptions •Skal håndteres

•Unchecked exceptions •Må håndteres

Java Crash Course Copyright © Lund&Bendsen A/S

63


Java Crash Course • • • • • • • • • •

Objektorienteret programmering med Java Komposition, arv og polymorfi Synlighedsregler Arrays & Collections if-else, switch, while- og for-løkker Exceptions Enumerations Generics Annotationer Nestede klasser Java Crash Course Copyright © Lund&Bendsen A/S

64


Eksempler på ”enumerations” • En enumeration er en opregning/opremsning af et endeligt sæt af værdier – fx: – – – – – – –

Forår, sommer, efterår og vinter Klør, spar, ruder og hjerter Es, to, tre, …, ti, knægt, dame og konge Rød, grøn og gul (i lyskryds) Mandag, tirsdag, …, lørdag og søndag Januar, februar, …, november og december Mand og kvinde

• Enumeration forkortes ofte til blot ”enum”. Java Crash Course Copyright © Lund&Bendsen A/S

65


Hvornår skal man bruge enums? • Man bør bruge enums hver gang man har brug for et forudbestemt sæt af konstante – Herunder naturlige opregninger som ugens dage, farverne i et sæt spillekort osv. – Herunder også andre sæt, hvor man kender samtlige mulige værdier på kompileringstidspunktet – fx valgmuligheder i en menu, separatortegn i en tekstfil eller kommandolinie-parametre.

• Det er ikke et krav, at sættet af konstante i en enum type forbliver fastlåst for altid. Enum-faciliteten er specifikt designet, så den tillader videreudvikling, som forbliver kompatibel binært set (dvs. uden rekompilering) – husk dog at eksisterende switch’es nu vil ramme default. Java Crash Course Copyright © Lund&Bendsen A/S

66


Enumerations i Java 5 • I Java 5 kan en enumeration laves som følger: public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES }

• Bemærk at navnene på enum-konstantene per konvention skrives med store bogstaver (ligesom alm. konstante) • Slutresultatet minder lidt om følgende: public final class Suit { Sikrer at kun klassen selv kan oprette nye instanser private Suit( ){ } public static final Suit CLUBS = new Suit (); public static final Suit DIAMONDS = new Suit (); public static final Suit HEARTS = new Suit (); public static final Suit SPADES = new Suit (); } Java Crash Course Copyright © Lund&Bendsen A/S

67


Java Crash Course • • • • • • • • • •

Objektorienteret programmering med Java Komposition, arv og polymorfi Synlighedsregler Arrays & Collections if-else, switch, while- og for-løkker Exceptions Enumerations Generics Annotationer Nestede klasser Java Crash Course Copyright © Lund&Bendsen A/S

68


Definition af generic types • Definition: En generic type / parameteriseret type er en type, der tager en typeparameter (eller evt. flere typeparametre vha. kommasepareret liste) • Typeparameteren bruges alle de steder i klassen, hvor man typisk ellers ville have brugt typen Object. • Per konvention navngives typeparametre med ét stort bogstav – fx E for element, K for key, V for value osv. • Eksempel: public interface Stack<E> { public void push(E element); public E pop(); }

Java Crash Course Copyright © Lund&Bendsen A/S

69


Hvad er tilladt og hvad er ikke tilladt? public class Pair<T>{

public class Pair<T>{

private T t1; private T t2;

private T t1 = new T( ); private T t2 = new T( );

public Pair( T t1, T t2 ){ this.t1 = t1; this.t2 = t2; }

public Pair(T t1, T t2){ this.t1 = t1; this.t2 = t2; }

public T getT1( ){ return t1; } public T getT2( ){ return t2; }

public T getT1( ){ return t1; } public T getT2( ){ return t2; }

}

} Java Crash Course Copyright Š Lund&Bendsen A/S

70


Intro til subtyperegler for generics // Er OK Object object = new Double(2.3); // Er OK (men burde nok ikke have været ok) Object[ ] objects = new Double[10]; // Er IKKE OK (se hvorfor i ex03.subtyping.rules) Vector<Object> objects = new Vector<String>( ); Forskellige på typeparameteren

// Er OK (typehierarki ml. generiske typer gælder stadig) List<String> words = new ArrayList<String>( ); Forskellige på typen Java Crash Course Copyright © Lund&Bendsen A/S

71


Hvorfor skal generiske typer vĂŚre ens? List<Person> personList = new ArrayList<Kursist>(); Object

Person

List<Person> personer = new ArrayList<Person>(); // Kode vi ikke kender til List<Kursist> kursistList = personer; Instruktor

Java Crash Course Copyright Š Lund&Bendsen A/S

Kursist

72


Har vi styr på subtypereglerne? Hvilke af følgende er lovlige jf. typereglerne for generics? • • • • • • • • •

LinkedList<String> words = new LinkedList<String>(); List<String> words = new LinkedList<String>(); LinkedList<CharSequence> words = new LinkedList<String>(); LinkedList<Object> objects = new LinkedList<String>(); LinkedList objects = new LinkedList<String>(); LinkedList<String> words = new LinkedList(); LinkedList<String> words = (LinkedList<String>)new LinkedList(); List words = new LinkedList<String>(); Object o = new LinkedList<String>();

Se svarene på næste slide... Java Crash Course Copyright © Lund&Bendsen A/S

73


Har vi styr på subtypereglerne? Hvilke af følgende er lovlige jf. typereglerne for generics? • • • • • • • • •

LinkedList<String> words = new LinkedList<String>(); List<String> words = new LinkedList<String>(); LinkedList<CharSequence> words = new LinkedList<String>(); LinkedList<Object> objects = new LinkedList<String>(); LinkedList objects = new LinkedList<String>(); LinkedList<String> words = new LinkedList(); LinkedList<String> words = (LinkedList<String>)new LinkedList(); List words = new LinkedList<String>(); Object o = new LinkedList<String>();

Java Crash Course Copyright © Lund&Bendsen A/S

OK OK

OK OK OK OK OK

74


Java Crash Course • • • • • • • • • •

Objektorienteret programmering med Java Komposition, arv og polymorfi Synlighedsregler Arrays & Collections if-else, switch, while- og for-løkker Exceptions Enumerations Generics Annotationer Nestede klasser Java Crash Course Copyright © Lund&Bendsen A/S

75


@Override (java.lang) (2/2) Eksempel på brugen af annotation-typen @Override: public class Person { @Override public String toSting() { … } } Giver en kompilefejl (bemærk stavningen!) Java Crash Course Copyright © Lund&Bendsen A/S

76


@SuppressWarnings (java.lang) (2/2) Eksempel på brugen af annotation-typen @SuppressWarnings: public class Main { @SuppressWarnings({“deprecation”, “unused“}) public static void main(String[ ] args) throws Exception{ Thread t = new Thread( ); t.stop( ); // call to deprecated method int var = 12; // unused variable } } Andre eksempler: @SuppressWarnings("unchecked") // mht. generics @SuppressWarnings("fallthrough") // mht. switch Java Crash Course Copyright © Lund&Bendsen A/S

77


@Deprecated (java.lang) @Documented @Retention(value=RUNTIME) public @interface Deprecated { }

// brug af denne kommer med i JavaDoc // er tilgængelig under runtime

• Det frarådes at bruge et element, der er markeret med @Deprecated – enten fordi det er farligt, eller fordi der findes et bedre alternativ • Kompileren advarer (warning), hvis et ikke-deprecated programelement benytter et deprecated program-element • Annotationen erstatter ikke JavaDocs @deprecated-tag: – JavaDocs @deprecated er rettet mod dokumentationen – Annotationen @Deprecated er rettet mod kompileren

• Eclipse viser hvis man benytter et deprecated element – fx Thread.stop(): Java Crash Course Copyright © Lund&Bendsen A/S

78


Eksempel Definition (kaldes for en annotation type – svarer til en klasse): public @interface RequestForEnhancement { int id( ); String synopsis( ); String engineer( ) default "unassigned"; String date( ) default ”n/a"; } Anvendelse (kaldes for en annotation – svarer til et objekt): @RequestForEnhancement( id = 2868724, synopsis = "Enable time-travel", engineer = "Mr. Peabody" ) public static void travelThroughTime(Date destination) { ... } Java Crash Course Copyright © Lund&Bendsen A/S

79


Java Crash Course • • • • • • • • • •

Objektorienteret programmering med Java Komposition, arv og polymorfi Synlighedsregler Arrays & Collections if-else, switch, while- og for-løkker Exceptions Enumerations Generics Annotationer Nestede klasser Java Crash Course Copyright © Lund&Bendsen A/S

80


Simpelt eksempel pü nested klasse public class OuterClass { ... // kode ... public static class NestedClass{ ... // kode ... } } Java Crash Course Copyright Š Lund&Bendsen A/S

81


Nestede klasser stoler på hinanden 2/2 • Hvis B er erklæret i A betyder det, at A og B stoler mere på hinanden, end klasser normalt gør • I praksis betyder det, at A og B kan tilgå alle members hos hinanden uanset synlighed (også private!) public class A { private int x; Kode i A kan se private members i B

private class B { private int y;

Kode i B kan se private members i A

} } Kode i C kan ikke se private members i B

class C { }

Kode i C kan ikke se private Java Crash Course members i A Copyright © Lund&Bendsen A/S

82


Arv og indlejring er to uafhængige ting • Arv og indlejring er to helt forskellige ting • Arv og indlejring bruges uafhængigt af hinanden public class A { private class B {

public class A { private class B extends A {

} void illegalMethod() { A a = new B(); } }

} void legalMethod() { A a = new B(); } }

Java Crash Course Copyright © Lund&Bendsen A/S

83


Eksempel på en inner class (non-static) • En inner class er mere speciel end static nested classes • Instanser af klasser bliver nemlig til inner objects (tænk på det som objekter inden i objekter) class Ydre { int k = 3; class Indre { int k = 4; public int getIndreK() { return this.k; } public int getYdreK() { return Ydre.this.k; } } } y … i Ydre y = new Ydre(); Ydre.Indre i = y.new Indre(); System.out.println(i.getIndreK()); // 4 Java Crash Course System.out.println(i.getYdreK()); // 3Copyright © Lund&Bendsen A/S

Ydre k 3

Indre k 4 Ydre.this.k this.k

84


Anonym inner class erklæret i en metode Den anonyme inner klasse arver fra denne klasse

Den anonyme inner klasse kalder sin super-klasses constructor – svarer her til: super( s );

Den anonyme inner public MyClass createMyClass(final int i) { klasse instantieres String s = ...;

return new MyClass( s ) { int k = i; ... } ;

Den anonyme inner klasses body

} Java Crash Course 85 Afslutning Copyright © Lund&Bendsen af A/S return-udtrykket


Eksempel på anonym indre klasse // Sorterer et streng-array efter længden af strengene public void sortArrayByStringLength(String[] stringArray) { Arrays.sort( stringArray, new Comparator<String>() { @Override public int compare(String s1, String s2) { return (s1.length() – s2.length()); } } ); }

Java Crash Course Copyright © Lund&Bendsen A/S

86


Regler for en static nested type 1/2 • Klassen eller interfacet erklæres som en static member af en anden type. • En static nested type opfører sig som alle andre top-level (ikke-nestede) typer – dog: – Er dens navn medbestemt af typen den står i: EnclosingName.NestedName – Er dens synlighed medbestemt af typen den står i – er usynlig hvis EnclosingType er usynlig

• Bruges som strukturerings- og scoping-mekanisme for typer, der logisk set er relaterede. Java Crash Course Copyright © Lund&Bendsen A/S

87


Regler for en static nested type 2/2 • EnclosingType kan se alle members, som NestedType definerer og omvendt (gælder også private members og nedarvede). • Se ex01.visibility.TestVisibility • Da NestedType er en member i EnclosingType, kan den defineres med alle fire synligheder (public, protected, <default> og private), hvor klasser ellers normalt defineres med enten public eller <default>. Dog er members i interfaces altid public. Java Crash Course Copyright © Lund&Bendsen A/S

88


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.