Algoritmiek Primitieve Types, Casting, Polymorphism, Interfaces. Hoorcollege 13 - Ma. 27 nov. 2006 L.M. Bosveld-de Smet Java’s data typen Primitive types boolean Numerieke typen integer types: byte, short, int, long floating-point types: float, double character type: char Reference types String, Integer, Account, NewEmployee, …. Integer Types Java ’s integer types: Type byte short int long Size 8 16 32 64 bits bits bits bits Smallest Value –128 –32,768 –2,147,483,648 –263 Largest Value 127 32,767 2,147,483,647 263–1 Integer Classes Byte, Short, Integer, Long java.lang package. Elke class bevat constanten: MIN_VALUE en MAX_VALUE Bijvoorbeeld: Byte.MIN_VALUE is –128 Byte.MAX_VALUE is 127. Methode parse… Methoden om String om te zetten naar getal: Byte.parseByte Integer.parseInt Long.parseLong Short.parseShort Floating-Point Types float double Type float double Smallest Size Positive Value Largest Value Precision 32 bits 64 bits 1.40 10–45 4.94 10–324 3.40 1038 1.79 10308 6 digits 15 digits Speciale Waarden java.lang package: Constanten: Float en Double. POSITIVE_INFINITY NEGATIVE_INFINITY NaN Methode: isNaN char Type Voor willekeurige karakters char ch; Toekenningen ch ch ch ch = = = = 'a'; 'A'; '0'; ' '; // // // // Lowercase a Uppercase A Zero Space ASCII Character Set ASCII (American Standard Code for Information Interchange) 128 characters Spatie (character 32) gaat vooraf aan de cijfers (48–57). Hoofdletters (65–90) komen voor de kleine letters (97–122). ASCII Character Set Control characters eerste 32 karakters en laatste karakter, del Niet op scherm toonbaar, niet te printen Printing characters Karakters die geen control characters of spatie zijn Java: Unicode Character Set Relatie tussen ASCII, Latin1 en Unicode: Escape Sequences Te gebruiken in character en String literals: Naam Escape Sequence Backspace Form feed Line feed Carriage return Horizontal tab Backslash Single quote Double quote Octal escape \b \f \n \r \t \\ \' \" \0–\377 Operaties met karakters Berekeningen: getalswaarden int i = 'a'; char ch = 65; ch++; // i is nu 97 // ch is nu 'A' // ch i now 'B' Vergelijkingen: getalswaarden if ('a' <= ch && ch <= 'z') … Operaties met karakters ‘controlling expression’ in een switch statement: switch (letter) { case 'a': case 'e': case 'i': case 'o': case 'u': System.out.println("Vowel"); break; case 'y': System.out.println("Possible vowel"); break; default: System.out.println("Consonant"); break; } Operaties met karakters als ‘loop counter’: for (char ch = 'A'; ch <= 'Z'; ch++) … Nadelen: 'a' * 'b' / 'c‘ wordt geaccepteerd bugs die ontstaan door per ongeluk gebruik van karakter voor getal worden niet ontdekt door Java compiler. characters versus Strings ISBN-nummer zonder streepjes for (int i = 0; i < isbn.length(); i++) { char ch = isbn.charAt(i); if (ch != '-') System.out.print(ch); } Character Class Character class (java.lang package) Methoden om karakters te testen of om te zetten: Character.isDigit('a') false Character.isISOControl('a') false Character.isISOControl('\n') true Character.isLetter('a') true Character.isLetterOrDigit(' ') false Character.isLowerCase('A') false Character.isUpperCase('A') true Character.isWhitespace('\n') true Character.toLowerCase('A') 'a‘ Character.toUpperCase('A') 'A' Type Conversie Mengen van verschillende typen in een operatie Impliciete conversie: automatische conversie Expliciete conversie: conversies toegestaan aan programmeur Impliciete conversie Operanden van verschillende typen ‘numeric promotion’ Assignments met data van verschillende typen Rechts krijgt type van links, mits links ‘wijder’ is Short s; int i; i = s; // toegestaan int i; float f; i = f; // niet toegestaan Argument en parameter van verschillende typen Type van argument wordt type van parameter, mits parameter ‘wijder’ is Conversie naar String ‘Breedte’ van primitieve typen Numerieke typen: Casting Type conversie op bevel van programmeur int i; float f; … i = (int) f; // Cast f naar int type Casting van floating-point number naar integer type: truncatie f = 45.6; i = (int) f; // i is 45 Algemene vorm van een ‘cast’: ( type-name ) expression Kerneigenschappen van O-O design Abstraction: abstractie Encapsulation: inkapseling Inheritance: overerving Polymorphism: veelvormigheid Interface Klassen hierarchie zoogdieren carnivoren katten honden herbivoren … … Type conversie Objecten van een bepaald class type worden behandeld als objecten van een ander class type Beperkingen: hond ≠ herbivoor kat ≠ hond carnivoor ≠ hond Assignment restricties c type Carnivoor k carnivoren X katten honden … type Kat h type Hond X … eetVlees … … type Carnivoor Assignment restricties c type Carnivoor k carnivoren … miauwt eetVlees katten honden … type Kat h type Hond X … type Kat Assignment restricties c type Carnivoor k carnivoren X katten honden … type Kat h type Hond … blaft eetVlees … type Hond Assignment “up”, beperkte toepassing van methodes c Carnivoor c = new Kat (); type Carnivoor … miauwt c.miauwt(); // niet OK eetVlees … type Kat Casting en Anonieme verwijzing c type Carnivoor … miauwt ((Kat)c).miauwt(); // is OK eetVlees type Kat … type Kat Polymorphism Specifieke methode-aanroep op verschillende momenten leidt tot verschillend gedrag Selectie van code tijdens run-time Dynamische binding Interfaces Plaatsen van beperkingen op verzameling klassen Klassen die een interface ‘implementeren’ vertonen een bepaald gedrag, en erven alle in de interface gedefinieerde constanten Voorbeeld: abstracte public interface Example { public void doSomething(); } methode Stappenplan voor interface Schrijf interface Vorm: public interface <interface name> { <abstract method headings>; <constant declarations>; } Voeg implements <interface name> toe aan alle klassen die haar implementeren, en controleer of deze klassen volledige definities bevatten van de in de interface genoemde methoden gebruik “casting” om zeker te zijn dat alle aanroepen van interface-methoden worden toegepast op type <interface name> referenties. Voorbeeld 1: interface Payable /* Payable.java Authors: Koffman & Wolz * the Payable interface. */ public interface Payable { public double calcWeeklyPay(); } NewCompany class public void computePayroll () { System.out.println ("ID" + "\t" + "pay"); for (int i = 0; i < employees.length; i++) { // calculate weekly pay double weekPay; NewEmployee emp = employees[i]; if (emp instanceof HourlyEmployee) weekPay = ((HourlyEmployee) emp).calcWeeklyPay(); else if (emp instanceof SalaryEmployee) weekPay = ((SalaryEmployee) emp).calcWeeklyPay(); else weekPay = 0.0; // add the weekly pay amount to employee's total pay emp.updateTotalPay (weekPay); // add the weekly pay amount to the payroll payroll += weekPay; // display ID and pay System.out.println (emp.getSocial() + "\t" + weekPay); } } NewCompany class public void computePayroll () { System.out.println ("ID" + "\t" + "pay"); for (int i = 0; i < employees.length; i++) { // calculate weekly pay double weekPay; NewEmployee emp = employees[i]; if (emp instanceof Payable) weekPay = ((Payable) emp).calcWeeklyPay(); else weekPay = 0.0; // add the weekly pay amount to employee's total pay emp.updateTotalPay (weekPay); // add the weekly pay amount to the payroll payroll += weekPay; // display ID and pay System.out.println (emp.getSocial() + "\t" + weekPay); } } HourlyEmployee public class HourlyEmployee extends NewEmployee implements Payable { … public double calcWeeklyPay() { return hours * rate; } … } SalaryEmployee public class SalaryEmployee extends NewEmployee implements Payable { … public double calcWeeklyPay() { if (annualSalary > 0) return annualSalary / 52; else return 0; } … } TestNewCompany Voorbeeld 2: Comparable interface public interface Comparable { public int compareTo (Object obj); } String class implements Comparable interface String class heeft een compareTo () method. Method call resultaat verklaring “this”.compareTo(“that”) positief negatief zero “this” “that”.compareTo(“this”) “same”.compareTo(“same”) “that” “same” is groter dan “that” is kleiner dan “this” is gelijk aan “same” Probleem: sorteren van Comparable objecten Sorteren van objecten van willekeurig type Sorteren van integers, String objecten, NewEmployee objecten, etc. IntArray class IntArray class Zoeken naar een bepaalde waarde in de array voor elk array element, doe het volgende: als het huidige element overéénkomt met de gezochte waarde geef de index van het huidige element terug. geef -1 terug. Sorteren van de waarden in de array voor elke index, vanaf 0 tot aan de laatste index, doe het volgende: vind de positie (posMin) van het kleinste element in de subarray startend bij het element behorende bij de huidige index (<array name>[fill]) verwissel het kleinste element met het element behorende bij index fill. TestIntArray output Generieke selectionSort Class method van class Sorts public class Sorts { // postcondition: elements in array x are in increasing order public static void selectionSort (Comparable[] x) { int posMin; // index of next smallest element Comparable temp; // temporary variable for exchange for (int fill = 0; fill < x.length - 1; fill++) { /* invariant: * the elements in x[0] through x[fill-1] are in their * proper place and fill < x.length is true */ // find index of smallest element in subarray // starting at element x[fill]. posMin = findPosMin (x, fill); // exchange elements with indices fill and posMin if (posMin != fill) { temp = x[fill]; x[fill] = x[posMin]; x[posMin] = temp; } } } findPosMin(): helper method // postcondition: returns the position of the smallest // element in array x from x[fill] to the end. private static int findPosMin (Comparable[] x, int fill) { // assume smallest element is at position fill int posMinSoFar = fill; // remember any smaller value found in the array for (int i = fill + 1; i < x.length; i++) { if (x[i].compareTo (x[posMinSoFar]) < 0) posMinSoFar = i; } // posMinSoFar is index of smallest element return posMinSoFar; } } Toepassen selectionSort op array met String objecten public interface Comparable { public int compareTo(Object obj); } public class TestStringSort { public static void main (String[] args) { public class String extends … String names = new String[5]; implements Comparable { … … //sort the array names public int compareTo(Object obj) { Sorts.selectionSort(names); String s = (String) obj; … … } } … public class Sorts { public static void selectionSort(Comparable[]x) { } … } Toepassen selectionSort op array met NewEmployee objecten public class NewCompany { public interface Comparable { private NewEmployee[] employees; public int compareTo(Object obj); … } //sorts employees by social security number public void sortEmployees { Sorts.selectionSort(employees); public class TestNewCompany { } public static void main (String[] args) { implements Comparable { … NewCompany myCompany = NewCompany(3); … } … public int compareTo (Object obj) { //sort employees by social security number NewEmployee emp = (NewEmployee) obj; myCompany.sortEmployees(); return this.socSecNum.compareTo … (emp.socSecNum); } public class Sorts { } public class NewEmployee public static void selectionSort(Comparable[]x) { … … } } TestNewCompany met sorteren