Föreläsning 6: Objekt

Statiska och dynamiska minnesutrymmen

Allt vi har deklarerat på den yttersta nivån i klassen, alltså main(), andra metoder och globala variabler har varit static, vilket betyder att dom existerar från det att programmet laddats till dess att programmet avslutats. Om man inte skriver något static före en variabel kommer den inte att ha något minnesutrymme vid körningens start utan skapas under körningens gång med new. Eftersom varje new skaffar nya minnesutrymmen är det lämpligt med dynamiskt minne när man behöver ett okänt antal minnesfack.

Här ser vi ett exempel på en klass med två statiska minnesutrymmen.

class Kompis {
    static String namn;
    static int skonr;
}

Den som bara har en kompis kan notera namn och skonummer i Kompis.namn och Kompis.skonr, men för den som har flera kompisar är den här klassen lämpligare.
class Kompis {
    String namn; // Inte static! 
    int skonr;   // Inte static! 
}

Varje new Kompis() skapar en nytt objekt eller instans av Kompis i minnet, dvs något med med plats för namn och skonummer. Se följande exempel.
class EnKompis {
    public static void main(String[] args) {
	Kompis vän; // Variabel att hålla reda på en kompis
	vän = new Kompis(); // Här skapas objektet
	vän.namn = "Henrik"; // Sätt lämplig info för kompisen
	vän.skonr = 46;

	// Skriv ut kompisens namn och skonummer
	System.out.println(vän.namn + " : " + vän.skonr);
    }
}

Den som har sjutton kompisar kan samla sjutton sådana poster i en vektor.
 
class Kompislista {
    static int N = 17; // Antal kompisar

    public static void main(String[] args) {
	// Vektor med plats för N st kompisar
	Kompis[] vänner = new Kompis[N];
	
	// Skapa alla kompisar
	for (int i = 0; i < vänner.length; ++i) {
	    // Skapa en kompis i taget, lägg i vektorn
	    vänner[i] = new Kompis();
	    vänner[i].namn = Mio.getLine();
	    vänner[i].skonr = Mio.getInt();
	    Mio.getLine(); // Kasta bort ev. skräp skrivet efter talet
	}
	
	System.out.println("Storfotade vänner:");
	for (int i = 0; i < vänner.length; ++i) {
	    if (vänner[i].skonr >= 44) {
		System.out.print(vänner[i].namn + " : ");
		System.out.println(vänner[i].skonr);
	    }
	}
    }
}

Urklass, som ett ur eller som mall för flera ur

Låt oss programmera ett tidtagarur, som kan anropas var som helst i våra program.
public class Urdumt {
    static long starttid;
    static long stopptid;
    static boolean går = false;

    static void start() {
	if (går)
	    return;
	starttid = System.currentTimeMillis();
	går = true;
    }

    static void stopp() {
	if (!går) 
	    return;
	stopptid = System.currentTimeMillis();
	går = false;
    }

    static long tid() {
	return stopptid - starttid;
    }
}

Här är klassen Ur bara en samling av nyttiga metoder för ett enda ur, och den anropas på vanligt sätt enligt nedan.
class Tidtagning1 {
    public static void main(String[] args) {
	while(true) {
	    System.out.print("1 start, 2 stopp, 3 sluta: ");
	    int val = Mio.getInt();
	    if (val == 1)
		Urdumt.start();
	    if (val == 2)
		Urdumt.stopp();
	    if (val == 3) 
		break;

	    if (!Urdumt.går) 
		System.out.println(Urdumt.tid() + " ms");
	}
    }
}

Fördelen med objekt är att man kan skapa hur många tidtagarur man vill med new.
public class Ur {
    long starttid;
    long stopptid;
    boolean går = false;

    void start() {
	if (går)
	    return;
	starttid = System.currentTimeMillis();
	går = true;
    }

    void stopp() {
	if (!går) 
	    return;
	stopptid = System.currentTimeMillis();
	går = false;
    }

    long tid() {
	return stopptid - starttid;
    }
}


class Tidtagning2 {
    public static void main(String[] args) {
	Ur ur1 = new Ur();
	Ur ur2 = new Ur();

	while(true) {
	    System.out.print("1 start1, 2 stopp1, 3 start2, 4 stopp2: ");
	    int val = Mio.getInt();
	    if (val == 1)
		ur1.start();
	    if (val == 2)
		ur1.stopp();
	    if (val == 3)
		ur2.start();
	    if (val == 4)
		ur2.stopp();
	    if (val == 5)
		break;
	    if (!ur1.går) 
		System.out.println("ur1: " + ur1.tid() + " ms");
	    if (!ur2.går) 
		System.out.println("ur2: " + ur2.tid() + " ms");
	}
    }
}


^ Upp till kurssidan.


Sidansvarig: <vahid@nada.kth.se>
Senast ändrad 30 september 2003
Tekniskt stöd: <webmaster@nada.kth.se>