(27 augusti 2012 Repetitionsmaterial 1 ) Hur ser ett Java-program ut? // Ett första Java-program som skriver // ut ett meddelande på terminalen public class HelloWorld { public static void main(string [] args) { System.out.println("Hello world!");
(27 augusti 2012 Repetitionsmaterial 2 ) Programstruktur och terminologi Ett program består av en eller flera klasser Varje klass lagras på en fil med samma namn En klass innehåller data (attribut) och metoder För att en klass skall kunna köras som ett eget program måste det finnas metod med namnet main
Exempel: en funktion public class Factorial { public static long fact(int n) { long result = 1; for ( int i= 1; i<=n; i++ ) result *= i; return result; public static void main(string [] args) { for ( int i = 0; i <= 10; i++ ) { System.out.println( i + "! = " + fact(i) ); Två metoder, inga dataattribut, lokala variabler i metoderna. (27 augusti 2012 Repetitionsmaterial 3 )
(27 augusti 2012 Repetitionsmaterial 4 ) Frågor Vad betyder 1. public 2. static 3. int 4. long 5. void 6. for 7. String[] args?
(27 augusti 2012 Repetitionsmaterial 5 ) Enkla datatyper Typ värden storlek exempel byte heltal 1 byte -127, 47 short heltal 2 byte 4711 int heltal 4 byte -748471 long heltal 8 byte 434112345L float flyttal 4 byte -4.57e10f double flyttal 8 byte 3.123e-128 boolean logisk 1 byte true, false char tecken 2 byte x, 4, +
(27 augusti 2012 Repetitionsmaterial 6 ) Utmatning i terminalfönstret System.out.print(String s) System.out.println(String s) System.out.println() Enbart radbyte För formattering används antingen klassen NumberFormat eller (fr o m Java 5) metoden format (även benämnd printf).
(27 augusti 2012 Repetitionsmaterial 7 ) Scanner-klassen Kan användas för att läsa ord, tal mm (s.k. tokens ) från tangentbordet. Koppla ett Scanner-objekt till inströmmen: Scanner sc = new Scanner(System.in) Några metoder: sc.hasnext() sc.next() sc.nextline() sc.hasnextint() sc.nextint() sc.hasnextdouble() sc.nextdouble() boolean String String boolean int boolean double
(27 augusti 2012 Repetitionsmaterial 8 ) Exempel: Tabell med funktionsvärden // TableIO.java // Demonstrerar användning av Scanner Resultat import java.util.scanner; class TableIO { public static void main(string [] args) { double x, xlow, xhigh; int number; Scanner sc = new Scanner(System.in); System.out.print("Undre gräns: "); xlow = sc.nextdouble(); System.out.print("Övre gräns: "); xhigh = sc.nextdouble(); System.out.print("Antal värden: "); number = sc.nextint(); double step = (xhigh - xlow) / (number-1); for ( int i = 1; i<=number; i++ ) { x = xlow + (i-1)*step; System.out.print(x); System.out.println("\t" + Math.log(x)); vega$ java TableIO Undre gräns: 0 Övre gräns: 10 Antal värden: 11 0.0 -Infinity 1.0 0.0 2.0 0.6931471805599453 3.0 1.0986122886681096 4.0 1.3862943611198906 5.0 1.6094379124341003 6.0 1.791759469228055 7.0 1.9459101490553132 8.0 2.0794415416798357 9.0 2.1972245773362196 10.0 2.302585092994046 vega$
(27 augusti 2012 Repetitionsmaterial 9 ) Vad händer vid felaktiga indata? vega$ java TableIO Undre gräns: 0 Övre gräns: 10 Antal värden: 12.3 Exception in thread "main" java.util.inputmismatchexception at java.util.scanner.throwfor(scanner.java:819) at java.util.scanner.next(scanner.java:1431) at java.util.scanner.nextint(scanner.java:2040) at java.util.scanner.nextint(scanner.java:2000) at TableIO.main(TableIO.java:16) vega$ Uppgift 1
(27 augusti 2012 Repetitionsmaterial 10 ) Klasser och objekt Ett program består oftast av flera klasser En klass beskriver någon typisk enhet i programmet När ett program exekverar så kan det skapa en eller flera instanser av klasserna så kallade objekt Objekten kommunicerar med varandra genom att anropa varandras metoder
(27 augusti 2012 Repetitionsmaterial 11 ) Exempel: En punkt i planet public class Point { private double x, y; public Point() { this.x = 0; this.y = 0; public Point( double x, double y ) { this.x = x; this.y = y; // Konstruktor // Konstruktor Observera: 1. Privata attribut 2. Två konstruktorer - överlagring 3. Skillnaden mellan x och this.x
(27 augusti 2012 Repetitionsmaterial 12 ) Exempel: klassen Circle public class Circle { private Point center; private double radius; public Circle( Point center, double radius ) { this.center = center; this.radius = radius; public void scale(double sf) { this.radius = sf*this.radius; public double area() { return Math.PI*this.radius*this.radius;
(27 augusti 2012 Repetitionsmaterial 13 ) Exempel: klassen TestCircle public class TestCircle { public static void main(string [] args) { Point p = new Point( 0.5, -3.5 ); Circle c = new Circle( p, 1.0 ); Circle d = c; System.out.println("Area of c: " + c.area()); c.scale(2.0); System.out.println("Area of d: " + d.area());
(27 augusti 2012 Repetitionsmaterial 14 ) Klasser och objekt Objekt skapas med new Referensvariabler håller reda på objekt En referensvariabel kan vara null Punktnotation används för att referera attribut och metoder Exekveringen börjar i main Klassen Math Uppgift 2
Exempel: Tärning public class Die { private int nosides; private int value; public Die() { nosides = 6; public Die(int ns) { nosides = ns; public int roll() { return value = (int) (Math.random()*noSides) + 1; public int get() { return value; (27 augusti 2012 Repetitionsmaterial 15 )
(27 augusti 2012 Repetitionsmaterial 16 ) Observationer på klassen Die Två konstruktorer - s.k. överlagring Skyddsnivåer: public, private Fler finns: paket (eng. package) och protected Privata attribut, publika metoder Tilldelning har värde Skulle kunna ändra antal sidor om t ex public void setnosides(int n) och, ev. public int getnosides() Typecast som t ex (int) Uppgift 3
(27 augusti 2012 Repetitionsmaterial 17 ) Exempel på användning av klassen Die import java.util.scanner; public class CheckDie { public static void main(string[] args) { Scanner sc = new Scanner(System.in); System.out.print("Number of sides: "); int nsides = sc.nextint(); int[] freq = new int[nsides]; Die d = new Die(nSides); for (int i= 1; i<=1000; i++ ) { freq[d.roll()-1]++; for (int i= 0; i<nsides; i++) System.out.println( (i+1) + "\t" + freq[i] );
(27 augusti 2012 Repetitionsmaterial 18 ) Observationer Användning av en array Arrayer skapas dynamiskt med new Arrayer hanteras med referenser Minsta index 0 i array Använde data som index Uppgift 4 och 5
(27 augusti 2012 Repetitionsmaterial 19 ) Mer om referenser När ett objekt skapas med new returneras en referens (dvs en pekare eller adress) till det skapade objektet. Deklarationen Die t; gör inte t till en Die utan till en referens till en Die Referenser kan tilldelas till referensvariabler (av rätt typ) och jämföras med == och!= Instansvariabler av referenstyp initieras till null this är en referens till det egna objektet
(27 augusti 2012 Repetitionsmaterial 20 ) Mer om referenser Flera referenser kan peka till samma objekt. Blir resultatet av tilldelningen t1 = t2; Observera att relationsoperatorerna == och!= jämför adresserna dvs som de står för fysiskt samma objekt inte huruvida objekten ser lika ut Om ingen referens till ett objekt är det borttappat. Borttappade objekt samlas ihop automatiskt av skräpsamlaren.
(27 augusti 2012 Repetitionsmaterial 21 ) Ännu mer om referenser Referenser kan skickas som parametrar till en metod (objekt kan naturligtvis inte skickas) Om objektet förändras av metoden så har det effekt Man kan säga att objekten existerar globalt och är åtkomliga överallt där man har en referens till dem En metod kan returnera referenser som funktionsvärden
(27 augusti 2012 Repetitionsmaterial 22 ) Exempel Skapa kopior av objekt public class Circle { Point center; double radius; public Circle( Point cen, double rad ) { center = cen; radius = rad; public Circle( Circle c) { // konstruktor center = c.center; radius = c.radius; public Circle copy() { // metod return new Circle( center, radius ); public static void main(string [] args) { Circle c = new Circle( new Point(0.,0.), 1.0 ); Circle d = c; Circle e = new Circle(c); Circle f = c.copy(); Uppgift 6
(27 augusti 2012 Repetitionsmaterial 23 ) Jämförelser av objekt Igen: Relationsoperatorerna == och!= jämför bara referenserna! Alla objekt har en metod equals() som jämför objekt innehållsmässigt byte för byte I regel definierar man dock en egen equals() Referenser kan inte jämföras storleksmässigt men man kan naturligtvis definiera egna metoder för att jämföra objekt
(27 augusti 2012 Repetitionsmaterial 24 ) Några exempel på jämförelsefunktioner public class Circle { Point center; double radius; public boolean equals(circle c) { return Math.abs(radius-c.radius) < 1.e-10; public boolean identical(circle c) { if ( radius==c.radius && center.getx() == c.center.getx() && center.gety() == c.center.gety()) return true; else return false; public int compareto(circle c) { if ( radius == c.radius ) return 0; else if (radius < c.radius) return -1; else return 1; public boolean lessthan(circle c) { return radius < c.radius;
(27 augusti 2012 Repetitionsmaterial 25 ) Klassvariabler Hittills har alla dataattribut varit instans-variabler dvs varje objekt har sin egen upplaga av dessa Man kan också ha klass-variabler som är gemensamma för alla objekt i klassen vilket anges med static En klassvariabel kan referas på samma sätt vanliga attribut men vanligen genom klassnamn.variabelnamn Det går också att ha klass-metoder som alltså kan användas utan frikopplat från objekten (ex Math.sin() och main()) En klassmetod kan inte referera objektattribut och ej heller anropa andra objektmetoder utan att gå via en objektreferens
(27 augusti 2012 Repetitionsmaterial 26 ) Exempel public class Circle1 { Point center; double radius; int id; static int ncircles = 0; public Circle1( Point cen, double rad ) { center = cen; radius = rad; id = ++ncircles; public static void report() { System.out.println( "Antal skapade cirklar: " + ncircles ); public static void main(string [] args) { Circle1 c; for ( int i = 1; i<=10; i++ ) c = new Circle1( new Point( 10*i, 15*i ), 5*i ); report();
(27 augusti 2012 Repetitionsmaterial 27 ) Mer om arrayer Fält (arrayer) är ett slags objekt och hanteras således med referenser och har attribut och metoder. Deklaration typ [] namn typ [] namn = fältreferens typ [] namn = {v 0, v 1,... v n Skapas med new typ [antal] eller, som en kopia av annat fält med (typ[])fältreferens.clone()
(27 augusti 2012 Repetitionsmaterial 28 ) Exempel public class Circles { Circle [] thecs; int ncs; public Circles() { ncs = 0; thecs = new Circle[5] ; public void add(circle c) { thecs[ncs++] = c; public static void main(string [] args) { Circles circles = new Circles(); Point p = new Point(0,0); for ( int i = 1; i<=10; i++ ) circles.add( new Circle( p, 10*i ) ); kursa$ java Circles java.lang.arrayindexoutofboundsexception: 5 at Circles.add(Compiled Code) at Circles.main(Compiled Code) kursa$
(27 augusti 2012 Repetitionsmaterial 29 ) En bättre add-metod public class Circles { Circle [] thecs; int ncs; public void add(circle c) { if ( thecs.length == ncs ) { Circle [] newarr = new Circle[2*theCs.length]; System.arraycopy( thecs, 0, newarr, 0, thecs.length ); thecs = newarr; thecs[ncs++] = c;... OBS: length och System.arraycopy Uppgift 7
(27 augusti 2012 Repetitionsmaterial 30 ) Exempel: Instickssortering public class InsertionSort { public static void sort( int [] a ) { int i, j; for ( i = 1; i<a.length; i++ ) { int x = a[i]; for ( j = i - 1; j>=0 && x<a[j]; j-- ) a[j+1] = a[j]; a[j+1] = x; public static void main(string [] args ) { int a[] = {5, 17, 3, 19, 10, 12, 2; sort(a); for (int i= 0; i<a.length; i++ ) System.out.print( a[i] + " " ); System.out.println(); Uppgift 8
(27 augusti 2012 Repetitionsmaterial 31 ) Typkonverteringar Java konverterar automatiskt när det kan ske riskfritt Explicit med s.k. typecasts. Ex: (short) Vid aritmetik omvandlas byte, short till int Om en operand är long så omvandlas den andra till long (om den är av heltalstyp) Funktioner i Math returnerar double
(27 augusti 2012 Repetitionsmaterial 32 ) Omslagsklasser Till var och en av de primitiva datatyperna finns en omslagsklass (eng wrapper class) Klasserna har samma namn som de primitiva typerna men med inleds med en versal (de som hör till int och char heter dock Integer och Character) Dessa klasser innehåller Ett antal klass-attribut med konstanter (t ex max och minvärde) Ett antal klass-metoder för t ex konverteringar Ett antal instansmetoder för motsvarande för ett objekt
(27 augusti 2012 Repetitionsmaterial 33 ) Tecken import java.io.*; public class Tecken { public static void main(string [] args ) throws IOException { int nupper=0, nlower=0, nothers=0; char c; BufferedReader inf = new BufferedReader(new InputStreamReader(System.in)); System.out.print("> "); System.out.flush(); while( (c=(char)inf.read())!= \n ) { if ( Character.isUpperCase(c) ) nupper++; else if ( Character.isLowerCase(c) ) nlower++; else nothers++; System.out.println( "Stora: " + nupper + ", små: " + nlower + ", övriga: " + nothers );
(27 augusti 2012 Repetitionsmaterial 34 ) Observera 1. Scanner-klassen passar inte för att läsa tecken (ingen nextchar ) 2. Använder en BufferedReader som via en InputStreamReader kopplas till System.in. Ett standardsätt. 3. java.jo.* måste importeras 4. Raden throws IOException i början av main (Varför behövs inte den raden när man använder Scanner?) Uppgift 9
(27 augusti 2012 Repetitionsmaterial 35 ) Klassen String Ett objekt ur klassen String består av en följd av char Strängkonstanter omges med citationstecken String s = Omge strängar med \! Objekt av typen String är oföränderliga. Alla operationer nedan som resulterar i strängar skapar nya sådana. Operatorn + konkatenerar strängar Tecknen i strängen numreras från 0
(27 augusti 2012 Repetitionsmaterial 36 ) Några metoder i klassen String length() charat(n) substring(n) substring(n,m) compareto(s) equals(s) indexof(c) indexof(s) replace(c1,c2) touppercase() tolowercase()
(27 augusti 2012 Repetitionsmaterial 37 ) Exempel: Palindromcheck import java.util.scanner; public class Palindrom { public static void main(string[] args) { String w; int n; boolean pal; Scanner sc = new Scanner(System.in); while (sc.hasnext()) { w = sc.next(); w = w.touppercase(); if ( w.equals("stop") w.equals("quit")) break; n = w.length(); pal = true; for ( int i=0; i < n/2; i++) { if (w.charat(i)!=w.charat(n-1-i)) { pal = false; break; if ( pal ) System.out.println(w + " palindrom"); else System.out.println(w + " ej palindrom");
(27 augusti 2012 Repetitionsmaterial 38 ) Arrayer med strängar Parametern till main är ett exempel på en array av strängar. När programmet startas kommer orden på kommandoraden att lagras som element i denna array. Exempel: public class Echo { public static void main( String [] args ) { for ( int i = 0; i<args.length ; i++ ) System.out.print( args[i] + ); System.out.println(); kursa$ java Echo hej du glade! hej du glade! kursa$ Uppgift 10
(27 augusti 2012 Repetitionsmaterial 39 ) Konvertering av objekt till String Man kan definiera omvandlig av objekt till typen String för t ex utskriftsändamål genom att definiera en metod tostring(): public class Circle { Point center; double radius; public String tostring() { return "Circle(" + center + ", " + radius + ") "; public static void main(string [] args) { Circle c = new Circle( new Point(0.,0.), 1.0 ); System.out.println( c ); kursa$ java Circle Circle(Point@1fa4d404, 1.0) kursa$ Uppgift 11
Mer om klasser class namn { deklarationer av instansvariabler definition av metoder Ingen speciell ordning krävs men... Instansvariablerna synlighet är sällan publika utan privata eller skyddade (protected) eller, möjligen, paketsynliga. Instansvariabler har defaultvärden beroende på typ (typiskt 0) Instansvariabler kan initieras i deklarationen till godtyckliga uttryck (ingående variabler måste vara definierade) Instansvariabler kan anges som final vilket förhindrar ändring (dvs en konstant (27 augusti 2012 Repetitionsmaterial 40 )
(27 augusti 2012 Repetitionsmaterial 41 ) Metodefinition modifierare typ namn(typ 1 p 1, typ 2 p 2,... ) { lokala variabler och satser Modifierarna anger t.ex. synlighet Lokala variabler har inga defaultvärden! Om typen inte är void så måste en sats return u; där u är ett uttryck av rätt typ. Metoder kan ha samma namn om de har olika signatur dvs skiljer sig i parameterantal och/eller typ (överlagring)
(27 augusti 2012 Repetitionsmaterial 42 ) Metodanrop Från metod i samma klass: metodnamn(argumentlista) Från metod i annan klass: referens.metodnamn(argumentlista) Om static-metod i annan klass: klassnamn.metodnamn(argumentlista) (Ex: Math.exp(x))
(27 augusti 2012 Repetitionsmaterial 43 ) Konstruktorer Attributen kan tilldelas värden direkt i deklarationen (alternativt erhålla defaultvärden) Man kan definiera en eller flera konstruktorer för mer komplicerade initieringar En konstruktor är en metod som har samma namn som klassen och som saknar typ Om man inte definierar någon konstruktor tillhandahåller systemet en defaultkonstruktor som saknar parametrar och inte gör någonting Om man definierar en eller flera konstruktorer så tillhandahåller inte systemet någon defaultkonstruktor om man vill ha en parameterlös konstruktor så får man skriva en själv
(27 augusti 2012 Repetitionsmaterial 44 ) Parameter och resultatöverföring Vid anrop sker 1. De uttryck som givits som argument beräknas 2. De beräknade värdena förs över till parametrarna 3. Internt i metoden används parametrarna lokala variabler de kan t.ex. tilldelas nya värden 4. Inga värden återföres via parametrarna vi return Metoden kallas värdeanrop (eng. call by value) och möjliggör således ej returparametrar. (Kan dock åstadkommas genom att skicka referenser till objekt.)