Som du vet, gir en klasse plan for objekter; du lager et objekt fra en klasse. Hver av følgende utsagn hentet fra CreateObjectDemo
-programmet oppretter et objekt og tilordner det til en variabel:
Den første linjen oppretter et objekt av Point
klasse, og den andre og tredje linjen lager hver et objekt av Rectangle
klassen.
Hver av disse utsagnene har tre deler (diskutert i detalj nedenfor):
- Erklæring: Koden satt med fet skrift er alle variabeledeklarasjoner som knytter et variabelnavn til en objekttype.
- Instantiering: Det nye nøkkelordet er en Java-operatør som oppretter objektet.
- Initialisering: Den nye operatøren blir fulgt av et anrop til en konstruktør som initialiserer det nye objektet.
Erklærer en variabel å referere til et objekt
Tidligere lærte du at for å erklære en variabel, skriver du:
type name;
Dette varsler kompilatoren om at du vil bruke navn til å referere til data hvis type er type. Med en primitiv variabel reserverer denne erklæringen også riktig mengde minne for variabelen.
Du kan også erklære en referansevariabel på sin egen linje. For eksempel:
Point originOne;
Hvis du erklærer originOne
slik, vil verdien være ubestemt til et objekt faktisk er opprettet og tilordnet det. Bare å erklære en referansevariabel skaper ikke et objekt. For det må du bruke operatøren new
, som beskrevet i neste avsnitt. Du må tilordne et objekt til originOne
før du bruker det i koden din. Ellers får du en kompilatorfeil.
En variabel i denne tilstanden, som for øyeblikket ikke refererer til noe objekt, kan illustreres som følger (variabelnavnet, originOne
, pluss en referanse som peker på ingenting):
Instantiering av en klasse
Den nye operatøren instantierer en klasse ved å tildele minne til et nytt objekt og returnere en referanse til det minnet. Den nye operatøren påkaller også objektkonstruktøren.
Den nye operatøren krever et enkelt postfix-argument: et anrop til en konstruktør. Navnet på konstruktøren gir navnet på klassen som skal instantieres.
Den nye operatøren returnerer en referanse til objektet den opprettet. Denne referansen er vanligvis tilordnet en variabel av passende type, som:
Referansen som returneres av den nye operatøren, gjør ikke må tilordnes en variabel. Den kan også brukes direkte i et uttrykk. For eksempel:
int height = new Rectangle().height;
Denne uttalelsen vil bli diskutert i neste avsnitt.
Initialisering av et objekt
Her er koden for punktklassen:
public class Point { public int x = 0; public int y = 0; //constructor public Point(int a, int b) { x = a; y = b; }}
Denne klassen inneholder en enkelt konstruktør. Du kan gjenkjenne en konstruktør fordi erklæringen bruker samme navn som klassen og den ikke har noen returtype. Konstruktøren i poengklassen tar to heltallargumenter, som deklarert av koden (int a, int b). Følgende uttalelse gir 23 og 94 som verdier for disse argumentene:
Point originOne = new Point(23, 94);
Resultatet av å utføre dette uttalelse kan illustreres i neste figur:
Her er koden for Rectangle-klassen, som inneholder fire konstruktører:
Hver konstruktør lar deg oppgi innledende verdier for rektangelets opprinnelse, bredde og høyde, ved hjelp av både primitive og referansetyper. Hvis en klasse har flere konstruktører, må de ha forskjellige signaturer. Java-kompilatoren skiller t han konstruktører basert på antall og type argumenter. Når Java-kompilatoren møter følgende kode, vet den å ringe konstruktøren i klassen Rektangel som krever et punktargument etterfulgt av to heltallargumenter:
Rectangle rectOne = new Rectangle(originOne, 100, 200);
Dette kaller en av Rectangle
«s konstruktører som initialiserer origin
til originOne
. Også setter konstruktøren width
til 100 og height
til 200.Nå er det to referanser til det samme punktobjektet – et objekt kan ha flere referanser til det, som vist i neste figur:
Følgende kodelinje kaller Rectangle
-konstruktøren som krever to heltallargumenter, som gir den første verdier for bredde og høyde. Hvis du inspiserer koden i konstruktøren, vil du se at den oppretter et nytt punktobjekt hvis x- og y-verdier initialiseres til 0:
Rectangle rectTwo = new Rectangle(50, 100);
Rektangelkonstruktøren som brukes i følgende påstand, tar ikke noen argumenter, så den kalles en ikke-argumentkonstruktør:
Rectangle rect = new Rectangle();
Alle klassene har minst en konstruktør. Hvis en klasse ikke eksplisitt erklærer noe, gir Java-kompilatoren automatisk en konstruktør uten argument, kalt standardkonstruktøren. Denne standardkonstruktøren kaller klassens overordnede konstruktør uten argument, eller Object
konstruktøren hvis klassen ikke har noen annen foreldre. Hvis foreldrene ikke har noen konstruktør (Object
har en), vil kompilatoren avvise programmet.