HTML Comment |
---|
|
Hvordan en klasse defineres: Hvordan en instans av en klasse opprettes: |
Denne siden vil forsøke å forklare siden Objekter og klasser i Java-kontekst. Om man på forhånd har forstått den objektorienterte tankegangen, vil Java implementasjonenene være vesentlig lettere å forstå. Om man synes den objektorienterte tankegangen er vanskelig å forstå, vil det kanskje hjelpe å se den i Java-kontekst. Definere en klasse
En klasse består typisk av felt, metoder og konstruktør(er). Samspillet mellom disse definerer oppførsel og tilstand for objektet.
Felter og metoder
Code Block |
---|
language | java |
---|
title | Simple class |
---|
| public class MyDescriptiveAndConciseClassname {
} |
- class - Dette betyr at "eieren" av innholdet i { } er en klasse.
- 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. - 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 |
---|
language | java |
---|
title | Class with fields |
---|
| public class Song {
public String title;
public Person artist;
public String lyrics;
} |
- Det er her valgt et kort og presist klassenavn, og man burde
ikke være i tvil om hva denne klassen "representerer". - 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 |
---|
language | java |
---|
title | Class with fields and methods |
---|
| public class Song {
private 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
}
} |
- 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. - 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. - 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
|
Konstruktør
En konstruktør er en spesiell metode som bare kalles når man oppretter en ny instans av en klasse, altså lager et nytt objekt. Dersom et objekt er avhengig av at felt x og y har verdier for at objektet skal ha en gyldig tilstand, gir en konstruktør muligheten til å si at disse feltene må "oppgis" ved opprettelsen. Om man ikke har definert noen konstruktør (slik som over), vil Java sette inn en "tom", og denne kalles men utfører ingen forandring på objektets initielle tilstand.
Code Block |
---|
language | java |
---|
title | Class with constructor |
---|
| public class Song {
private String title;
public Person artist;
public String lyrics;
public Song(Person p) {
artist = p;
}
public String getTitle {...}
// Osv...
} |
- En konstruktør skiller seg fra en vanlig metode
ved at den ikke har noen returtype. I tillegg må konstruktøren ha samme navn som klassen. - 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, må man oppgi ett person-objekt.
| Code Block |
---|
language | java |
---|
title | Class with multiple constructors |
---|
| public class Song {
private 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 |
- 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 på Song-objektet. - 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 |
---|
language | java |
---|
title | New instance of class |
---|
| Song s = new Song(); |
Koden ovenfor viser hvordan en variabel, s, deklareres og knyttes til et nytt objekt. - Song s - representerer variabel-deklarasjonen.
- new Song() - tilsvarer opprettelsen av objektet.
Code Block |
---|
language | java |
---|
title | New 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! |
- s1 refererer her til et Song-objekthvor dens
konstruktør har "tatt imot" et person-objekt. - s2 refererer til et Song-objekthvor dens
konstruktør har "tatt imot" både et person-objekt og en streng - 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/refererer til et Song-objekt. Dette kan illustreres med figurer.
Code Block |
---|
language | java |
---|
title | Variable with reference |
---|
| Song s2 = new Song();
// Gitt at Song har en tom konstruktør |
Image Added
Fig. 1 | Code Block |
---|
language | java |
---|
title | Assigning reference to other variable |
---|
| Song s1 = new Song("Beat it");
Song s2; |
Image Added
Fig. 2 | Code Block |
---|
language | java |
---|
title | Continued |
---|
| s2 = s1;
System.out.println(s1 == s2);
// TRUE |
Image Added
Fig. 3 | Code Block |
---|
language | java |
---|
title | Continued 2 |
---|
| s1 = new Song("Let it be"); |
Image Added
Fig. 4 |
---|
Legg merke til at dersom man er i en situasjon slik som Fig. 3. Om man forandrer objektet s1 refererer til, vil man også ha forandret objektet s2 refererer til, siden disse er samme objekt.