Nada

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 körningens start till körningens slut. 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 Friend                              { 
  static String namn                      ; 
  static int skonr                        ;}
Den som bara har en vän kan notera namn och skonummer i Friend.namn och Friend.skonr, men för den som har flera vänner är den här klassen lämpligare.
class Friend                              { 
  String namn                             ;  // Inte static! 
  int skonr                               ;}
Varje new Friend() skapar en ny post i minnet med plats för namn och skonummer, enligt följande exempel.
 - - -
    Friend vän                            ;
    vän = new Friend()                    ; // Här skapas objektet
    vän.namn = "Henrik"                   ; // och namn och skonr
    vän.skonr = 46                        ; // tilldelas värden
    System.out.println(vän.namn+vän.skonr); // och skrivs ut
 - - -
Den som har sjutton vänner kan samla sjutton sådana poster i en vektor.
 
class Friendlist                            {
  static int N=17                           ;
  public static void main(String[] args)    {
    Friend[] vänner = new Friend[N]         ; // Vektor med sjutton
    for(int i=0; i<N; i++)                  { // poster skapas och
      vänner[i] = new Friend()              ; // posterna ges värden
      vänner[i].namn=Mio.GetLine()          ;
      vänner[i].skonr=Mio.GetInt()          ;
      Mio.GetLine()                         ;}
    System.out.println("Storfotade vänner:");
    for(int i=0; i<N; i++)           
      if(vänner[i].skonr>=44)               {
	 System.out.println(vänner[i].namn) ;
	 System.out.println(vänner[i].skonr);}}}

Urklass, med eller utan objekt

Låt oss programmera ett tidtagarur, som kan anropas var som helst i våra program.
public class Ur                                                     {
  static long starttid,stopptid                                     ;
  static boolean går=false                                          ;
  static void start()                                               {
    if(går) return                                                  ;
    går=true                                                        ;
    starttid=System.currentTimeMillis()                             ;}
  static void stopp()                                               {
    if(!går) return                                                 ;
    går=false                                                       ;
    stopptid=System.currentTimeMillis()                             ;}
  static long tid()                                                 {
    return stopptid-starttid                                        ;}}
Här är klassen Ur bara en samling av nyttiga metoder, och den anropas på vanligt sätt enligt nedan.
class Tidtagning1                                                   {
  public static void main(String[] args)                            {
    while(true)                                                     {
      System.out.println("1 start, 2 stopp, 3 sluta")               ;
      int val=Mio.GetInt()                                          ;
      if(val==1) Ur.start()                                         ;
      if(val==2) Ur.stopp()                                         ;
      if(val==3) break                                              ;
      if (!Ur.går) System.out.println(Ur.tid()+" ms")               ;}}}
Fördelen med objekt är att man kan skapa hur många tidtagarur man vill med new.
public class Urobjekt                                               {
  long starttid,stopptid                                            ;
  boolean går=false                                                 ;
  void start()                                                      {
    if(går) return                                                  ;
    går=true                                                        ;
    starttid=System.currentTimeMillis()                             ;}
  void stopp()                                                      {
    if(!går) return                                                 ;
    går=false                                                       ;
    stopptid=System.currentTimeMillis()                             ;}
  long tid()                                                        {
    return stopptid-starttid                                        ;}}

class Tidtagning2                                                   {
  public static void main(String[] args)                            {
    Urobjekt ur1,ur2                                                ;
    ur1=new Urobjekt()                                              ;
    ur2=new Urobjekt()                                              ;
    while(true)                                                     {
      System.out.println("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")      ;}}}

Sidansvarig: <henrik@nada.kth.se>
Senast ändrad 2 april 1999
Tekniskt stöd: <webmaster@nada.kth.se>