9/20/00
Kap J2-1
Klasser och Objekt i Java
• C++ använder beteckningarna datamedlem resp.
medlemsfunktion.
Passagerare
idankomsttid destination
kliverpå kliverav åker
Klassnamn
Metoder (operationer) Instansvariabler (attribut)
(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());
} }
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.
9/20/00
Kap J2-4
Enkla variabler och inbyggda typer
• Heltal
– byte 8-bitars heltal med tecken. [-128,127]
– short 16-bitars heltal med tecken. [-32768,32767]
– int 32-bitars heltal med tecken.
≈[-2*109, 2*10
9] – long 64-bitars heltal med tecken.
≈[-9*101 8, 9*10
18]
• Decimaltal
– float 32-bitars flyttal.
≈[-3*103 8, 3*10
38] – double 64-bitars flyttal.
≈[-2*103 0 8, 2*10
3 0 8]
• 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
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
e
(d) 0.0
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++!
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.
9/20/00
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
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 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;
}
Kap J2-15
Metoden main
• När Java-interpretatorn anropas, så exekveras först den main- metod 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));
}
9/20/00
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 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
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
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 );
} }
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
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) exln(x)
ceil(x) floor(x) minsta >=x resp. största <=x
p o w(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 x
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