Kap J2-1 Klasser och Objekt i Java • C++ använder beteckningarna datamedlem resp. medlemsfunktion. Klassnamn Passagerare Instansvariabler (attribut) id ankomsttid destination Metoder (operationer) kliverpå kliverav åker (Passagerare) 12 14.21 Blg (Passagerare) 23 15.56 Fln 9/20/00 Kap J2-2 Klassdefinition • 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()); } } 9/20/00 Kap J2-3 Variabler • 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. 9/20/00 1 Kap J2-4 Enkla variabler och inbyggda typer • Heltal – – – – byte short int long 8-bitars heltal med tecken. 16-bitars heltal med tecken. 32-bitars heltal med tecken. 64-bitars heltal med tecken. [-128,127] [-32768,32767] ≈[-2*109, 2*109 ] ≈[-9*1018 , 9*10 18 ] 32-bitars flyttal. 64-bitars flyttal. ≈[-3*1038 , 3*10 38 ] ≈[-2*10308, 2*10308] • Decimaltal – float – double • Logiska typer – boolean Endast värdena true eller false. • Tecken – char Endast 16-bitars Unicode-tecken. 9/20/00 Kap J2-5 Omslagsklasser • 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)) ….. 9/20/00 Kap J2-6 Operatorer • Aritmetiska operatorer + - */% • Logiska operatorer && || ! • Jämförelseoperatorer == != < <= > >= fungerar alla ≈ som i C++! 9/20/00 2 Kap J2-7 Referensvariabler • 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 (d) 0.0 e 9/20/00 Kap J2-8 Garbage collection • 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 delete i C++! 9/20/00 Kap J2-9 Textvariabler - String • 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. 9/20/00 3 Kap J2-10 Jämförelse av strängar. • 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”); 9/20/00 Kap J2-11 Andra String -metoder. • 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(). 9/20/00 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 ? 9/20/00 4 Kap J2-13 Metoder. • 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. 9/20/00 Kap J2-14 Klassen Date (egendef .) //Minimal Date class, No error //checks or javadoc comments public class {// Fields private int private int private int Date month; day; 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; } 9/20/00 Kap J2-15 Metoden main • 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 ); ); ); " + " + 9/20/00 5 Kap J2-16 Inkapsling och synlighet. • 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 annan klass i samma paket i subklass i ett annat paket en klass i ett annat paket private paket NEJ JA protected public JA JA NEJ NEJ JA JA NEJ NEJ NEJ JA 9/20/00 Kap J2-17 Initiering av objekt. • 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); } ……... 9/20/00 Kap J2-18 Kontrollstrukturer • 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. 9/20/00 6 Kap J2-19 Klassvariabler och klassmetoder • 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. 9/20/00 Kap J2-20 Litet testprogram import java.i o.*; 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 ); } } 9/20/00 Kap J2-21 Kompileringsfel , eller...? import java.i o.*; 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 ); } } 9/20/00 7 Kap J2-22 Standardklassen Math. • 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) ex ln(x) x ceil(x) floor(x) minsta >=x resp. största <=x pow(x,y) xy 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 9/20/00 Kap J2-23 Standardklassen Math, forts. • 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); 9/20/00 Kap J2-24 9/20/00 8