Klasser och Objekt i Java Kap J2-1 C++ använder beteckningarna datamedlem resp. medlemsfunktion. Klassnamn Instansvariabler (attribut) Metoder (operationer) Passagerare id ankomsttid destination kliverpå kliverav åker (Passagerare) 12 14.21 Blg (Passagerare) 23 15.56 Fln Klassdefinition Kap J2-2 Exempel: public class DoubleCell //instansvariabler private double val; //metoder public double readvalue() return val; public void writevalue(double value)val=value; //Anv av DoubleCell public class TestDoubleCell public static void main(string[] args) DoubleCell d= new DoubleCell(); d.writevalue(3.14); System.out.println( Innehåll: + d.readvalue()); Variabler Kap J2-3 Java har två kategorier av variabler: enkla variabler int,double,char,byte etc. referensvariabler används för att referera olika objekt. Variabeldeklaration modifierare typ variabelnamn= initieringsvärde; T ex int antal=0, nr=33; final double PI= 3.141; Date d; private int antalbarn ; //instansvariabel Instansvariabler initieras automatiskt till ett defaultvärde: 0 för enkla aritmetiska variabler. null för referenser. false för boolska variabler. Obs, gäller ej för lokala variabler. 1
Enkla variabler och inbyggda typer Kap J2-4 Heltal byte 8-bitars heltal med tecken. [-128,127] short 16-bitarsheltal med tecken. [-32768,32767] int 32-bitarsheltal med tecken. [-2*10 9, 2*10 9 ] long 64-bitarsheltal med tecken. [-9*10 18, 9*10 18 ] Decimaltal float 32-bitarsflyttal. [-3*10 38, 3*10 38 ] double 64-bitarsflyttal. [-2*10 308, 2*10 308 ] Logiska typer boolean Endast värdena trueeller false. Tecken char Endast 16-bitars Unicode-tecken. Omslagsklasser Kap J2-5 Omslagsklasser (wrapper classes) finns för var och en av de åtta inbyggda typerna. Finns i java.lang. Byte, Character, Integer, Float, Double o s v. Innehåller diverse konstanter och metoder för att operera på dessa. Omslagsklasser är s k final -klasser. kan expanderas inline av kompilatorn. Ex: float f=float.min_value; int k= Integer.MAX_VALUE; if (Float.isInfinite(f)).. Operatorer Kap J2-6 Aritmetiska operatorer + - * / % Logiska operatorer &&! Jämförelseoperatorer ==!= < <= > >= fungerar alla som i C++! 2
Referensvariabler Kap J2-7 new måste användas för att skapa ett objekt att referera till. Kopiering av objekt görs med hjälp av metoden clone() som många standardklasser har. DoubleCell d; d= new DoubleCell(); DoubleCell e=d; d null d e (d) 0.0 Garbage collection Kap J2-8 Java har inbyggd s k Garbage collection, d v s automatisk skräpsamling. Innebär att objekt som inte längre refereras förstörs. Det minnesutrymme som det upptog, frigörs och kan användas till annat. Systemet frigör inte ett minnesutrymme så länge det finns en referens till det! Obs! Finns ingen motsvarighet till deletei C++! Textvariabler - String Kap J2-9 Klassen String används för att hantera texter. är ej en enkel (primitiv) typ. objekten uppträder som en referenstyp. Definierar operatorerna + och += för konkatenering av texter: String m= Hej ; String n= igen! ; System.out.println(m+ + n); String-objekt är konstanta, kan EJ ändras (immutable)! String m += ; //nytt objekt skapas String m += n; //nytt objekt skapas System.out.println(m); Operanderna till operatorerna + och += skall båda vara av typen String. Används p s s som en inbyggd typ. 3
Jämförelse av strängar. Kap J2-10 För att undersöka om två strängar är lika används metoden equals(). För en lexikografisk jämförelse används metoden compareto(). String m= Hej ; String n= igen! ; if (m.equals(n)) System.out.println( Lika ); else System.out.println( Ej lika ); System.out.println(m.compareTo(n)); if (m==n) System.out.println( Refererar till samma objekt ); else System.out.println( Refererar Ej till samma objekt ); Andra String-metoder. Kap J2-11 Det finns ett antal metoder knutna till String-klassen. String m= Hej igen! ; int len= m.length() //=9 char ch= m.charat(2);//= j String s= m.substring(2,5); System.out.println(len + + ch + s); För de inbyggda typerna finns automatisk omvandling till typen String. Den görs även vid anrop av metoden System.out.println(). Kap J2-12 Omvandling mellan String och enkla typer, forts. Metoden tostring() kan också användas: System.out.println(Integer.toString(55)); Många klasser erbjuder en implementation av tostring(). Den anropas automatiskt vid omvandlingar. Förutsatt att den finns. Omvandlingar i den andra riktningen: int x= Integer.parseInt( 55 ); double y= Double.valueOf( 3.141 ).doublevalue(); //alt. y= Double.parseDouble( 3.141 );//JDK 1.2? 4
Metoder. Kap J2-13 Konstruktorer kontrollerar skapandet och initieringen av ett objekt. Överlagring möjliggör multipla konstruktorer. defaultkonstruktor skapas om ingen har getts. den initierar instansvariablerna med defaultvärden. (Mutators and Accessors) Accessmetoder avläser objektets tillstånd. Set-metoder ändrar ett objektets tillstånd. tostring() används för att kunna skriva ut ett objekts tillstånd. equals() används för att testa om två referenser refererar till likadana objekt. Statiska metoder Klassmetoder. Kan anropas direkt utan att gå via ett objekt. Klassen Date (egendef.) Kap J2-14 //Minimal Date class, No error //checks or javadoc comments public class Date // Fields private int month; private int day; private int year; // Zero-parameter constructor public Date( ) month = 1; day = 1; year=1998; // Three-parameter constructor public Date(int themonth, int theday, int theyear) month= themonth; day= theday; year = theyear; //Two equal values? public boolean equals(object rhs ) if(!(rhs instanceof Date ) ) return false; Date rhdate = ( Date ) rhs; return rhdate.month == month && rhdate.day == day && rhdate.year == year; // Conversion to String public String tostring( ) return day + "/" + month + " " + year; Metoden main Kap J2-15 När Java-interpretatorn anropas, så exekveras först den mainmetod som finns i den klassfil som refereras. Se föregående bild och nedan! // Sample main public static void main( String[] args ) Date d1 = new Date( ); Date d2 = new Date(1,1,1998); Date d3 = new Date(1,1,1999); System.out.println("Date 1: + d1 ); System.out.println("Date 2: + d2 ); System.out.println("Date 3: + d3 ); System.out.println("Date1==Date2?: " + d1.equals(d2)); System.out.println("Date1==Date3?: " + d1.equals(d3)); //end Date 5
Inkapsling och synlighet. Kap J2-16 Modifierare, vilka anger synlighet: private, public, protected Utelämnad modifierare innebär paketsynlighet Tanken är att de klasser som ingår i samma paket skall kunna lita på varandra. Synlighet Synlig i private paket protected public annan klass i samma paket NEJ JA JA JA i subklass i ett annat paket NEJ NEJ JA JA en klass i ett annat paket NEJ NEJ NEJ JA Initiering av objekt. Kap J2-17 Instansvariablerna kan initieras direkt! Konstruktorer kan överlagras. En konstruktor kan anropa en annan konstruktor m h a this! this refererar till objektet självt! public class Date // Fields private int month=1; private int day=1; private int year=1998; public Date( ) //Bör oftast finnas public Date(int month, int day, int year) this.month= month; this.day= day; this.year = year; public Date(int themonth, int theyear) this(themonth,1,theyear); public Date(int theyear) this(1,theyear);... Kontrollstrukturer Kap J2-18 Kontrollstrukturerna i Java fungerar i stort som i C++. Tyvärr i vissa fall. Typ av struktur Konstruktion ====================================== Villkor if - else switch case a? s : f Frågeteckensoperatorn ---------------------------------------------------------------------------------- Iteration while do - while for ----------------------------------------------------------------------------------- Avbrott break continue return ----------------------------------------------------------------------------------- Ingen operatoröverlagring i Java. 6
Klassvariabler och klassmetoder Kap J2-19 Kallas även statiska variabler/metoder. Är gemensamma för alla objekt i en viss klass. en klassvariabel finns bara i en instans. Klassvariabler kan initieras i en speciell klassinitierare, även kallad statisk initierare. Syntax: static deklarationer och satser Konstanter bör vara statiska. Klassmetoder använder ej vanliga instansvariabler. Litet testprogram Kap J2-20 import java.io.*; public class Sample private int x; private static int y; public final static int MAX_VAL = 10; static y=6; public static void main( String [ ] args ) Sample s1=new Sample(),s2= new Sample(); s1.y=4; s2.y=5; System.out.println( MAX_VAL + Sample.MAX_VAL); System.out.println( y= + y ); System.out.println( s1.x= + s1.x + s1.y= + s1.y ); System.out.println( s1.x= + s1.x + s1.y= + s1.y ); Kompileringsfel, eller...? Kap J2-21 import java.io.*; public class Sample private int x; private static int y; public final static int MAX_VAL = 10; static y=6; public class TestSample public static void main( String [ ] args ) Sample s1=new Sample(),s2=new Sample(); s1.y=4; s2.y=5; System.out.println(" MAX_VAL " + Sample.MAX_VAL); System.out.println(" y= " + y ); System.out.println(" s1.x= " + s1.x + " s1.y= " + s1.y ); System.out.println(" s1.x= " + s1.x + " s1.y= " + s1.y ); 7
Standardklassen Math. Kap J2-22 Standardklassen Math finns i paketet java.lang. innehåller metoder för de vanliga matematiska funktionerna. trigonometri, kvadratrötter, logaritmer, exponenter, min, max etc. java.lang.math ================================================ PI E talen pi resp. e abs(a) absolutvärdet av a max(a,b) min(a,b) största resp. minsta av a och b ---------------------------------------------------------------- ------------------ Följande returnerar värde av typ double (x och y reella tal) exp(x) log(x) sqrt(x) e x ln(x) x ceil(x) floor(x) minsta >=x resp. största <=x pow(x,y) x y round (x) x avrundat till heltal (long ) random(x) ger slumptal [0,1] ---------------------------------------------------------------- ------------------- sin(x) cos(x) tan (x) x anges i radianer asin(x) acos(x) atan (x) ger arcsin etc. sinh(x) cosh(x) tanh(x) hyperboliska funktionerna Standardklassen Math, forts. Kap J2-23 Några anrop: z=9.9*math.log(x); hyp= Math.sqrt(Math.pow(x,2)+ Math.pow(y,2)); d= Math.max(a, Math.max(b,c)); A=PI * Math.pow(r,2); Kap J2-24 8