1 Vad vi vet Vi har tidigare sett exemplet med inmatning från tangentbordet. Exemplet innehåller flera aspekter av klasser och objekt. import java.util.*; class KeyboardReading { public static void main(string [] arg) { Scanner tgb = new Scanner(System.in); System.out.println("Hur många endollarmynt har du?"); int antaldollar; antaldollar = tgb.nextint(); System.out.println("Jaså du har "+ antaldollar + " stycken."); Först och främst definierar vi en egen klass, rad 3, döpt KeyboardReading som innehåller en statisk metod main(... ). Main definierar som bekant startpunkten i våra applikationer och har därför en särställning. Vi utnyttjar klassen Scanner på rad 7. Rad 7 kan skrivas om som Scanner tgb; tgb = new Scanner(System.in); Omskrivningen visar hur skapandet av tgb kräver två steg. 1, deklarationen av identifieraren. Deklarationen gör att vi får ett namn tgb för att hålla reda på instanser av typen Scanner. Med enbart deklarationen är emellertid tgb inget objekt. Satsen tgb = new Scanner(... ) krävs alltså för att skapa Scannerobjektet. Då objektet är skapat kan vi använda instansens metoder, bla antaldollar = tgb.nextint(); Konstruktion av objekt: new Scanner(System.in) Anrop av metod: tgb.nextint() Vi utnyttjar en statisk medlem i klassen System på rad 8. Rad 8 kan skrivas om som PrintWriter skrivare = System.out; skrivare.println("hur många endollarmynt har du?"); Här innebär steg 1 att vi skapar en identifierare, ett alias, till den statiska medlemmen System.out. tilldelningen till skrivare är snarlik den tidigare rad 7. Skillnaden är att den statiska medlemmen System.out redan är konstruerad; det hände då javatolken startade. Steg 2 är ett metodanrop på samma sätt som tgb.nextint().
1.1 Centrala delar i en klass Klasser består av medlemmar. En medlem kan vara en konstruerare, ett attribut eller en metod. En medlem kan dessutom vara statisk eller ickestatisk. Den statiska medlemmen hör till klassen och kan därför sägas delas mellan alla objekt av klassen. Normalfallet är en ickestatisk medlem som är unik för varje objekt. Mer om det senare. Det vi sett tidigare är god exempel på hur en klass instansieras för att skapa ett objekt, och hur vi sedan kan använda metoder för att låta objekten utföra operationer. - Konstruktion: new Scanner() - metodanrop tgb.nextint() - statiska medlemmar, klassmedlemmar, System.out Formen på de olika operationerna är: Konstruktion: o = new Klassnamn(); o måste vara deklarerad med rätt typ. o kallas för objekt, eller en instans av Klassnamn. Ex Scanner tgb = new Scanner(); Metodanrop: objekt.metod( argument ) Ex tgb.nextint() Tänk på att metoden ofta utvärderas till ett värde, jfr 3 + 6 utvärderas till en int ex int i = 3 + 6; nextint() utvärderas också till en int, så det är naturligt att skriva int antaldollar = tgb.nextint(); Statiska medlemmar Klassnamn.medlem Ex. System.out medlemmen är out. Några korta ord om public static void main Då javatolken startar vårt program finns ingen instans av vår klass, javatolken gör alltså ett anrop som liknar KeyboardReader.main( argument ); Det vore onödigt att först skapa en instans av KeyboardReader och därefter anropa en metod. Därför måste main deklareras static! 1.2 Javadokumentationen Javadokumentationen är uppdelad i klasser, där varje klass har fått en egen sida. Det finns utöver klassidorna en uppdelning i paket. Där paketen länkar vidare till en samanställning av klasserna inom varje paket. Här visas startsidan:
Vi ser uppdelningen i paket och en lista med alla klasser i alla paket! Det är en lång lista. Om man känner klassnamnet gör man klokt i att söka efter klassen genom att markera/aktivera fönstret "All Classes", därefter söka efter klassen (Ctrl-f i Internet Explorer och Firefox). Om vi gör det för Scannerklassen. Man bockar med fördel för rutan "Matcha endast hela ord". Ett klick på Scannerlänken och vi ser dokumentationen för Scannerklassen
Alla klasser är dokumenterade enligt samma mönster: - Klassnamn och relaterade klasser - Översikt - Exempelkod (inte alltid) - Detaljinformation och tips (inte alltid) - Sammanfattning attribut - Sammanfattning Konstruerare - Sammanfattning Metoder - Detaljinformation om medlemmar Det vi ser i bilden är Klassnamn och relaterade klasser tillsammans med översikt och början på exempelavsnittet. Scannerklassen har inga attribut, så om vi tittar på sammanfattningsavsnittet ser vi:
Den konstruerare vi har använt är nummer tre Scanner(InputStream source) eftersom System.in är av typen InputStream. Om vandrar ner i metodavsnittet finner vi bland annat nextint() som vi använt tidigare.
Den nextint() metod vi använt är metod nummer tre i listan. I nummer fyra kan man dessutom ange en bas för heltalet, exempelvis basen 16 om man vill läsa in hexadecimala tal. Det skulle då se ut som // läs in ett hexadecimalt tal int hexvärde = tgb.nextint( 16 ); Om man då matar in exempelvis FF via tangentbordet får då heltalet värdet 255 (eller FF om man tänker i basen 16 :-). Länken för nextint() ger detaljerad information om metoden. 1.2.1 Andra viktiga klasser -String -Math Exempel: Räkna hur många tecken en användare matat in i ex text: import java.util.*; public class StringLength { public static void main(string[] args) { Scanner keyb = new Scanner(System.in); System.out.println("Ange ditt förnamn:"); String input = keyb.next(); // String innehåller metoden length():int int inputlength = input.length(); System.out.println("Ditt namn innehåller "+inputlength+" tecken"); En stor del i att lösa ett givet problem består i att finna rätt klass för uppgiften och därefter leta igenom dokumentationen för att finna rätt metod/metoder för att lösa uppgiften. Exempel: Räkna ut hur långt man kastar en boll Formel x = 2*v*v*cos(a)*sin(a)/g Där x är längden på kastet, v är utgångshastigheten på kastet, a är vinkeln man kastar, g är jordgravitationen 9.81 m/s².
import java.util.*; public class ThrowLength { public static void main(string[] args) { final double g = 9.81; // g går inte att ändra med final Scanner keyb = new Scanner(System.in); // inmatningar System.out.println("Hur fort kastar du? (m/s)"); double speed = keyb.nextdouble(); System.out.println("I vilken vinkel kastar du? (0-90 grader)"); double angle = keyb.nextdouble(); angle *= Math.PI/180.0; // grader till radianer för sin och cos // resultat double length = 2*speed*speed*Math.cos(angle)*Math.sin(angle)/g; System.out.println("Du kastar då "+length+" meter."); Leta rätt på metoderna i javadokumentationen som används i de båda exemplen. Den stora skillnaden mellan klasserna String och Math är att Stringklassen beskriver något konkret, nämligen en text. Math klassen är bara en behållare för metoder och attribut, såsom PI, som hör till matematik. Alla Mathklassen metoder är därför deklarerade statiska, vi kommer aldrig skapa ett Mathobjekt. Syntaxen för alla Mathmedlemmar är därför Math.medlem, ex Math.sin(3.1416). Syntaxen för alla Stringmedlemmar är däremot String objekt = "Hej"; objekt.medlem