Klasser och Objekt i Java • C++ använder beteckningarna

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