// En första version av BankKonto-klassen class BankKonto { private String namn; private long nr; private double saldo; private double ränta; // Klassen TestaBankKonto // Klassens uppgift är att skapa // och hålla reda på några BankKonto-objekt // och testa dess metoder public class TestaBankKonto { public void sättin(double summa) { saldo = saldo + summa; public void taut(double summa) { saldo = saldo - summa; public void saldobesked() { System.out.println(saldo); public void årsränta() { double r; r = saldo * ränta; System.out.println(r); public static void main(string [] args) { BankKonto bk1 = new BankKonto(); BankKonto bk2 = new BankKonto(); bk1.sättin(3000); bk2.sättin(200); System.out.println("Saldo bk1:"); bk1.saldobesked(); System.out.println("Saldo bk2:"); bk2.saldobesked(); bk1.taut(500); System.out.println("Saldo bk1:"); bk1.saldobesked(); System.out.println("Årsränta bk1:"); bk1.årsränta(); 1 2 Programmet producerar följande utskrift i terminalfönstret: Saldo bk1: 3000.0 Saldo bk2: 200.0 Saldo bk1: 2500.0 Årsränta bk1: 50.0 Programstruktur och terminologi Ett Javaprogram består av en eller flera klasser En klass kan beskriva någon typ av objekt som programmet hanterar - t ex klasserna BankKonto, Myra och Circle En klass kan också ha enbart adminstrativa uppgifter (t ex klassen TestaBankKonto). En klass innehåller data (attribut) och metoder 3 4
Några enkla datatyper Variabler Alla attribut (bl a) har en datatyp. En variabel är en storhet som har Hittills har vi sett exempel datatyperna ett namn (t ex ränta och saldo), int dvs heltal som 1 och -15 en datatyp (t ex int och double) och double dvs decimaltal som -3.75 och 1.0 ett värde av angiven datatyp. String dvs textsträngar som "Alles gut" och "Hej hopp OBS: Det är viktigt att hålla reda på datatyper! Attributen i en klass lagras som variabler men variabler förekommer även i andra sammanhang t ex för lagring av mellanresultat i metoder. 5 6 Variabeldeklarationer Referensvariabler Innan en variabel kan användas måste den deklareras Exempel int saldo; double x = 17; // Kan ges värde int numberofpages = 0; Ovanstånde kan vara såväl deklarationer av attribut som lokala variabler i metoder. För att hålla reda på objekt används referensvariabler String namn; Circle c; BankKonto bk1 = new BankKonto(); String hälsning = "Hej!"; 7 8
Namnregler och konventioner Tilldelningar och aritmetik Namn ( identifierare ) skall börja på bokstav och får följas av bokstäver och siffror Vissa namn är reserverade (t ex class, private, int,... ). Java är case-sensitive dvs det är skillnad på stora och små bokstäver Konventioner: Klassnamn börjar med versal Variabler (inklusive attribut) ges värden med den så kallade tilldelningsoperatorn =. int x = 0; int y = 1; x = 4; y = x; x = 3 + y; y = y - 1; // Dekalartion // Deklaration // Tilldelning // Nytt värde till y // Nytt värde till x // Nytt värde till y Variabler, attribut, metoder inleds med gemen. Versal inne i namnet kan användas för att öka läsbarhet. Följ namnkonventionerna! De två sista exemplet innehöll dessutom en beräkning. Observera att tilldelningen går från höger till vänster! 9 10 Generellt: variabel = uttryck; Aritmetiska uttryck variabel och uttryck skall normalt vara av samma typ även om det finns vissa avvikelser tillåts. int i = 4; double y = 0.5; double z; z = i; y = 3; i = 0.5; i = 1.0 // OK // OK // Fel // Fel De vanliga aritmetiska operatorerna: +, -, *, / Vanliga prioriteter. Kan ändras med parenteser. Om båda operanderna är av heltalstyp blir resultatet av heltalstyp annars blir resultatet av flyttalstyp (vanligen double) Vid division av uttryck av heltalstyp stryks eventuell decimaldel av resultatet. Operatorn % används för att erhålla resten vid division. 11 12
int n = 10; int m = 25; int i; int kvot, rest; double h; kvot = m/n; // kvot får värdet 2 rest = m%n; // rest får värdet 5 h = 1/n; // h får värdet 0.0 h = 1./n // h får värdet 0.1 h = 2. + 1/n; // h får värdet 2.0 h = 0.1; i = 10*h; // fel! i = (int) (10*h); // OK. Typomvandling! java.lang.math ÔÜ Klass Math innehåller ett antal matematiska funktioner. sqrt(x) sin(x) sinus cos(x) cosinus exp(x) exponentialfuktionen Ü log(x) abs(x) max(x,y) min(x,y) PI naturliga logaritmen absolutbeloppet (heltal, flyttal) största av x och y (heltal, flyttal) minsta av x och y (heltal, flyttal) konstanten random() slumptal mellan 0 och 1 13 14 För att använda dessa metoder anger man Math framför namnet. double x = 1; double y = 3; double radie = 1.5; double area double dist = Math.PI*radie*radie; = Math.sqrt(x*x + y*y); (Senare kommer vi visa hur man kan göra för att slippa skriva Math framför funktionsnamnet.) Tärning public class Die { private int value; public void roll() { value = (int) (Math.random()*6) + 1; System.out.println("Värdet blev " + value); 15 16
In- och utmatning Program behöver ofta kommunicera med omvärlden. Med omvärlden menas här t ex användaren som sitter vid datorn, filsystemet på datorn, andra program som kör på datorn eller andra datorer, användare och program ute i det världsvida nätverket Detta brukar kallas input/output och förkortas ofta med IO. I den här kursen begränsar vi oss i första hand till kommunikation med användaren vid den egna datorn. Kommunikationen kan ske via knappar, dialogrutor, menyer etc men tills vidare använder vi ett så kallat terminalfönster för detta. Utmatning i terminalfönstret (BlueJ skapar automatiskt ett terminalfönster vid behov) Metoder: System.out.print(String s) System.out.println(String s) System.out.println() Byter rad Enbart radbyte Java gör automatiskt strängar av storheter av annan typ än String. System.out.print("PI är "); System.out.println(Math.PI); alternativt System.out.println("PI är " + Math.PI); 17 18 Scanner-klassen Man måste importera Scanner-klassen med hjälp av raden Vi skall använda den inbyggda klassen Scanner för inmatning. Först måste vi skapa ett Scanner-objekt: Scanner sc = new Scanner(System.in) import java.util.scanner; först i filen ( programdokumentet ). Därefter kan man göra Sen kan vi bl a använda dessa metoder: sc.next() Läser en sträng sc.nextline() sc.nextint() sc.nextdouble() Läser resten av raden Läser ett heltalint Läser ett flyttal Scanner sc = new Scanner(System.in); System.out.print("Vad heter du? "); String name = sc.nextline(); System.out.print("Hur gammal är du? "); int age = sc.nextint(); System.out.println("Välkommen " + name); 19 20
För att köra detta måste vi förpacka det i en klass t ex som en main-metod: import java.util.scanner; public class ScannerDemo { public static void main(string [] args) { Scanner sc = new Scanner(System.in); System.out.print("Vad heter du? "); String name = sc.nextline(); System.out.print("Hur gammal är du? "); int age = sc.nextint(); if ( age>50 ) { System.out.println("Välkommen du gamle " + name); else System.out.println("Hej spoling!"); Så här ser terminalfönstret ut efter två körningar: Vad heter du? Karl August Hur gammal är du? 87 Välkommen du gamle Karl August Vad heter du? Anders Urban Hur gammal är du? 27 Hej spoling! 21 22