"Hej Amigo! Nu ska jag berätta om hur föremål skapas."

"Vad är det som är så komplicerat med det, farbror Rishi? Du skriver nytt och klassnamnet, anger rätt konstruktör och du är klar!"

"Det är sant. Men vad händer inuti föremålet när du gör det?"

"Vad händer?"

"Det här är vad som händer: Objektet skapas i flera steg."

1)  Först tilldelas minne för alla klassens medlemsvariabler.

2)  Sedan initieras basklassen.

3)  Sedan tilldelas alla variabler värden, om några är specificerade.

4)  Slutligen anropas konstruktorn.

"Det ser inte särskilt svårt ut: först variablerna, sedan konstruktören."

"Låt oss se hur detta fungerar i ett exempel med två klasser:"

Koda Beskrivning
class Pet
{
 int x = 5, y = 5; ←-
 int weight = 10; ←-

 Pet(int x, int y)
 {
  this.x = x; ←-
  this.y = y; ←-
 }
}
class Cat extends Pet
{
 int tailLength = 8; ←-
 int age;
 Cat(int x, int y, int age)
 {
  super(x, y); ←-
  this.age = age; ←-
 }
}
Deklarera två klasser: Pet(pet) och Cat(cat).

I klassen Cat ser vi ett explicit anrop till basklassens konstruktor .
Den ska alltid vara på första raden i konstruktorn.

Här är vad som händer efter att minnet har allokerats:
18  – anropa konstruktorn för basklassen.
3, 4  – initiera variabler i Pet.
8, 9  – exekvera koden i Pet-konstruktorn.

Sedan börjar Cat-klassen initieras.
14  – initiera variabler i Cat
19  – exekvera koden i Cat-konstruktorn

public static void main(String[] args)
{
 Cat cat = new Cat (50, 50, 5);
}

"Det är lite förvirrande. Varför är det så komplicerat?"

"Det är faktiskt inte svårt om du vet vad som verkligen händer:"

Om en klass inte har några konstruktorer skapas en automatiskt.

Standardkonstruktör
class Cat
{
 int x = 5;
 int y = 5;
}
class Cat
{
 int x = 5;
 int y = 5;
 public Cat() 
 {
 }
}

Om du inte anropar basklasskonstruktorn kommer den att anropas automatiskt.

Anrop av basklassens konstruktor
class Pet
{
 public String name;
}
class Pet extends Object
{
 public String name;
 public Pet()
 {
  super();
 }
}
class Cat extends Pet
{
 int x = 5;
 int y = 5;
}
class Cat extends Pet
{
 int x = 5;
 int y = 5;
 public Cat()
 {
  super();
 }
}

Medlemsvariabler initieras i konstruktorn.

Initialisering av medlemsvariabler
class Cat
{
 int x = 5;
 int y = 5;
}
class Cat
{
 int x;
 int y;
 public Cat()
 {
  super();
  this.x = 5;
  this.y = 5;
  }
}
Vad händer egentligen
class Pet
{
 int x = 5, y = 5;
 int weight = 10;
 Pet(int x, int y)
 {
  this.x = x;
  this.y = y;
 }
}

class Cat extends Pet
{
 int tailLength = 8;
 int age;
 Cat(int x, int y, int age)
 {
  super(x, y);
  this.age = age;
 }
}
class Pet extends Object
{
 int x;
 int y;
 int weight;

 Pet(int x, int y)
 {
  //call of the base class's constructor
  super();
  //initialize variables
  this.x = 5;
  this.y = 5;
  this.weight = 10;
  //execute the constructor code
  this.x = x;
  this.y = y;
 }
}
class Cat extends Pet
{
 int tailLength;
 int age;
 Cat(int x, int y, int age)
 {
  //call of the base class's constructor
   super(x, y);
  //initialize variables
  this.tailLength = 8;
  //execute the constructor code
  this.age = age;
 }
}

"Nu är det mycket tydligare: först basklassen, sedan variabler utanför konstruktorn, sedan konstruktorkoden."

"Bra gjort, Amigo! Det var allt!"