Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

 

Code Block
languagejava
titleSimple class
public class MyDescriptiveAndConciseClassname {
	
}
  1. class - Dette betyr at "eieren" av innholdet i { } er en klasse.
  2. public - Dette definerer synligheten til klassen. Ofte jobber
    programmer med flere klasser, og noen ganger vil man at 
    klassene skal "vite" om hverandre, andre ganger ikke.
    Mer om synlighet, se Innkapsling og 
    Synlighetsmodifikatorer.
  3. MyDescriptiveAndConciseClassname - Navnet på klassen.
    Har her valgt et forholdsvis teit klassenavn, men dette er 
    bare for å illustrere at det kan være akkurat det man ønsker.
    I tillegg forteller navnet hva slags klassenavn man egentlig
    ønsker; beskrivende og konsise på en gang.


Dette er en klasse med fryktelig lite mening, men uansett;
en klasse.


 

Code Block
languagejava
titleClass with fields
public class Song {
 
	public String title;
	public Person artist;
	public String lyrics;

}
  1. Det er her valgt et kort og presist klassenavn, og man burde
    ikke være i tvil om hva denne klassen "representerer".
  2. Song-klassen har her tre felter.
    Et felt fungerer omtrent som en vanlig variabel, men i stedet
    for å deklareres i en funksjon, deklareres feltet i klassen.
    Felter kan sees på som klassens egenskaper.
    Det vil si at et felt opptrer som en global variabel i klassen.

 

Code Block
languagejava
titleClass with fields and methods
public class Song {
 
	publicprivate String title;
	public Person artist;
	public String lyrics;
 
	public String getTitle() {
		return title;
	}
 
	public void setTitle (String title) {
		this.title = title;
	}
 
	public int countWordInLyrics(String word) {
		// Code that finds the number of
		// occurrences of "word" in lyrics-field
	}
}
  1. Når man lager funksjoner i klasser pleier man å kalle
    funksjonene klassen metoder. Metodene er bygget opp på
    helt lik måte som en funksjon
  2. Her er det opprettet to metoder; getTitle() & setTitle(...) som
    henholdsvis returnerer og forandrer feltet title. Disse kalles
    gettere og settere, som kan leses mer om under Innkapsling.
  3. countWordInLyrics(...) er en metode som hverken returnerer
    eller forandrer noen av feltene i klassen, men utfører en
    beregning basert på verdiene til ett av feltene 

...

 

Code Block
languagejava
titleClass with constructor
public class Song {
 
	publicprivate String title;
	public Person artist;
	public String lyrics;
 
	public Song(Person p) {
		artist = p;
	}
 
	public String getTitle {...}
	// Osv...
} 
  1. En konstruktør skiller seg fra en vanlig metode
    ved at den ikke har noen returtype. I tillegg
    konstruktøren ha samme navn som klassen.
  2. Man ser at konstruktøren Konstruktøren her tar inn et person-
    objekt og knytter det til artist-feltet.
    Det vil si at dersom man skal opprette ett objekt
    av klassen Song, slik den er definert over,
    man oppgi ett person-objekt for at objektet skal
    være gyldig. 

 

 

Code Block
languagejava
titleClass with multiple constructors
public class Song {
 
	publicprivate String title;
	public Person artist;
	public String lyrics;
 
	public Song(Person p) {
		artist = p;
	}
 	
	public Song(Person p, String t) {
		artist = p;
		title = t;
	}
	
	// ... Methods
  1. Her er det innført en ny konstruktør i tillegg til den fra
    forrige kodesnutt. Den nye konstruktøren tar inn
    en ekstra parameter t, som brukes til å sette tittel
    Song-objektet.
  2. Når man nå oppretter et nytt Song-objekt vil man kunne
    velge hvilken av konstruktørene man vil bruke, ved å
    "sende med" den ekstra parameteren, eller la være. 

Se neste kolonne for eksempler på hvordan konstruktørene
tas i bruk. 

 

Code Block
languagejava
titleNew instance of class
Song s = new Song();

Koden ovenfor viser hvordan en variabel, s,
deklareres og knyttes til et nytt objekt.

  1. Song s - representerer variabel-deklarasjonen.
  2. new Song() - tilsvarer opprettelsen av objektet.

 

Code Block
languagejava
titleNew instance of class, with constructor
Person michaelJ = new Person();

Song s1 = new Song(michaelJ);
Song s2 = new Song(michaelJ, "Beat it");
 
Song s3 = new Song(); // UGYLDIG!
  1. s1 refererer her til et Song-objekthvor konstruktørendens
    konstruktør har "tar tatt imot" et person-objekt.
  2. s2 refererer til et Song-objekthvor konstruktørendens
    konstruktør har "tar tatt imot" både et person-objekt og en stringen streng
  3. s3 er her deklarert for å knyttes mot et Song-objekt.
    Men her er new Song();  ugyldig siden klassen Song ikke
    har denne konstruktøren. Da klassen har konstruktører
    setter ikke Java inn en "tom", slik den ville gjort ellers.

Objektreferanser

For å beskrive forholdet mellom en variabel og et objekt har det så langt blitt brukt termer som at variabelen er "knyttet til", "referer til", "holder på" objektet osv. Dette skal nå forsøkes tydeliggjøres.
I kode-eksemplene over er det nemlig ikke slik at f.eks. s2 er et Song-objekt, men at s2 peker til et Song-objekt. Dette kan illustreres med en figur

 

Code Block
languagejava
titleVariable with reference
Song s2 = new Song();
// Gitt at Song har en tom konstruktør 

Image Added

Fortsetter i de neste kolonnene

Code Block
languagejava
titleAssigning reference to other variable
Song s1 = new Song("Beat it");
Song s2;

Image Added

Fortsettelse

Code Block
languagejava
titleAssigning reference to other variable 2
s2 = s1; 
System.out.println(s1 == s2);
// TRUE

Image Added

Fortsettelse

Code Block
languagejava
titleAssigning reference to other variable 3
s1 = new Song("Let it be");

Image Added