Som du vet tillhandahåller en klass ritningen för objekt; du skapar ett objekt från en klass. Var och en av följande påståenden från CreateObjectDemo
-programmet skapar ett objekt och tilldelar det till en variabel:
Den första raden skapar ett objekt av Point
-klassen och andra och tredje raden skapar vardera ett objekt av Rectangle
-klassen.
Var och en av dessa påståenden har tre delar (diskuteras i detalj nedan):
- Deklaration: Koden i fetstil är alla variabeldeklarationer som associerar ett variabelnamn med en objekttyp.
- Instantiering: Det nya nyckelordet är en Java-operatör som skapar objektet.
- Initialisering: Den nya operatören följs av ett anrop till en konstruktör som initierar det nya objektet.
Förklarar en variabel att hänvisa till ett objekt
Tidigare lärde du dig att för att deklarera en variabel skriver du:
type name;
Detta meddelar kompilatorn att du kommer att använda namn för att referera till data vars typ är typ. Med en primitiv variabel reserverar denna deklaration också rätt mängd minne för variabeln.
Du kan också deklarera en referensvariabel på sin egen rad. Till exempel:
Point originOne;
Om du förklarar originOne
så här kommer dess värde att vara obestämd tills ett objekt faktiskt skapas och tilldelas det. Att bara deklarera en referensvariabel skapar inte ett objekt. För detta måste du använda operatorn new
, som beskrivs i nästa avsnitt. Du måste tilldela ett objekt till originOne
innan du använder det i din kod. Annars får du ett kompileringsfel.
En variabel i detta tillstånd, som för närvarande inte refererar till något objekt, kan illustreras på följande sätt (variabelnamnet originOne
plus en referens som pekar på ingenting):
Instantiering av en klass
Den nya operatören omedelbar en klass genom att allokera minne för ett nytt objekt och returnera en referens till det minnet. Den nya operatören anropar också objektkonstruktören.
Den nya operatören kräver ett enda postfix-argument: ett samtal till en konstruktör. Namnet på konstruktören anger namnet på klassen som ska instansieras.
Den nya operatören returnerar en referens till objektet den skapade. Denna referens tilldelas vanligtvis en variabel av lämplig typ, som:
Den referens som den nya operatören returnerar gör inte måste tilldelas en variabel. Den kan också användas direkt i ett uttryck. Till exempel:
int height = new Rectangle().height;
Detta uttalande kommer att diskuteras i nästa avsnitt.
Initiera ett objekt
Här är koden för punktklassen:
public class Point { public int x = 0; public int y = 0; //constructor public Point(int a, int b) { x = a; y = b; }}
Denna klass innehåller en enda konstruktör. Du kan känna igen en konstruktör eftersom dess deklaration använder samma namn som klassen och den inte har någon returtyp. Konstruktören i punktklassen tar två heltalargument, som deklareras av koden (int a, int b). Följande uttalande ger 23 och 94 som värden för dessa argument:
Point originOne = new Point(23, 94);
Resultatet av att köra detta uttalande kan illustreras i nästa bild:
Här är koden för rektangelklassen, som innehåller fyra konstruktörer:
Varje konstruktör låter dig ange initialvärden för rektangelns ursprung, bredd och höjd med både primitiva och referenstyper. Om en klass har flera konstruktörer måste de ha olika signaturer. Java-kompilatorn differentierar t han konstruktörer baserat på antalet och typen av argumenten. När Java-kompilatorn stöter på följande kod vet den att ringa konstruktören i klassen Rektangel som kräver ett punktargument följt av två heltalargument:
Rectangle rectOne = new Rectangle(originOne, 100, 200);
Detta kallar en av Rectangle
”s konstruktörer som initialiserar origin
till originOne
Dessutom sätter konstruktorn width
till 100 och height
till 200.Nu finns det två referenser till samma punktobjekt – ett objekt kan ha flera referenser till det, som visas i nästa bild:
Följande kodrad ringer till Rectangle
-konstruktören som kräver två heltalargument, som ger initialt värden för bredd och höjd. Om du inspekterar koden i konstruktorn ser du att den skapar ett nytt punktobjekt vars x- och y-värden initialiseras till 0:
Rectangle rectTwo = new Rectangle(50, 100);
Rektangelkonstruktören som används i följande uttalande tar inga argument, så det kallas en konstruktion utan argument:
Rectangle rect = new Rectangle();
Alla klasser har minst en konstruktör. Om en klass inte uttryckligen förklarar något tillhandahåller Java-kompilatorn automatiskt en konstruktion utan argument, kallad standardkonstruktören. Den här standardkonstruktören kallar klassförälders konstruktör utan argument eller Object
konstruktorn om klassen inte har någon annan förälder. Om föräldern inte har någon konstruktör (Object
har en) kommer kompilatorn att avvisa programmet.