CodeGym /Java kursus /Modul 2: Java Core /Oprettelse af objekter: rækkefølgen af konstruktørkald

Oprettelse af objekter: rækkefølgen af konstruktørkald

Modul 2: Java Core
Niveau , Lektie
Ledig

"Hej, Amigo! Nu vil jeg fortælle dig om, hvordan objekter skabes."

"Hvad er der så kompliceret ved det, onkel Rishi? Du skriver nyt og klassenavnet, angiver den korrekte konstruktør, og du er færdig!"

"Det er rigtigt. Men hvad sker der inde i genstanden, når du gør det?"

"Hvad der sker?"

"Dette er, hvad der sker: Objektet skabes i flere faser."

1)  Først tildeles hukommelse til alle klassens medlemsvariable.

2)  Derefter initialiseres basisklassen.

3)  Derefter tildeles alle variablerne værdier, hvis der er angivet nogen.

4)  Til sidst kaldes konstruktøren.

"Det ser ikke særlig svært ud: først variablerne, så konstruktøren."

"Lad os se, hvordan dette fungerer i et eksempel med to klasser:"

Kode Beskrivelse
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; ←-
 }
}
Erklær to klasser: Pet(kæledyr) og kat(kat).

I Cat-klassen ser vi et eksplicit kald til basisklassens konstruktør .
Det skal altid være på den første linje i konstruktøren.

Her er, hvad der sker, efter at hukommelsen er allokeret:
18  – kald konstruktøren af ​​basisklassen.
3, 4  – initialiser variabler i Pet.
8, 9  – udfør koden i Pet-konstruktøren.

Så begynder Cat-klassen at blive initialiseret.
14  – initialiser variabler i Cat
19  – kør koden i Cat-konstruktøren

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

"Det er lidt forvirrende. Hvorfor er det så kompliceret?"

"Det er faktisk ikke svært, hvis du ved, hvad der virkelig foregår:"

Hvis en klasse ikke har nogen konstruktører, oprettes en automatisk.

Standard konstruktør
class Cat
{
 int x = 5;
 int y = 5;
}
class Cat
{
 int x = 5;
 int y = 5;
 public Cat() 
 {
 }
}

Hvis du ikke kalder basisklassekonstruktøren, kaldes den automatisk.

Kald af basisklassens konstruktør
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();
 }
}

Medlemsvariable initialiseres i konstruktøren.

Initialisering af medlemsvariabler
class Cat
{
 int x = 5;
 int y = 5;
}
class Cat
{
 int x;
 int y;
 public Cat()
 {
  super();
  this.x = 5;
  this.y = 5;
  }
}
Hvad sker der virkelig
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 er det meget mere klart: først basisklassen, så variabler uden for konstruktøren, så konstruktørkoden."

"Godt gået, Amigo! Det var det!"

Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION