“你好,阿米戈!現在我要告訴你對像是如何創建的。”
“這有什麼複雜的,Rishi叔叔?你寫new和類名,指明正確的構造函數,你就完成了!”
“那是真的。但是當你這樣做時,物體內部會發生什麼?”
“會發生什麼?”
“事情是這樣的:對像是分幾個階段創建的。”
1) 首先,為類的所有成員變量分配內存。
2) 然後初始化基類。
3) 然後所有的變量都賦值,如果指定的話。
4) 最後調用構造函數。
“看起來並不難:首先是變量,然後是構造函數。”
“讓我們看看它在兩個類的示例中是如何工作的:”
代碼 |
描述 |
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; ←-
}
}
|
聲明兩個類:Pet(pet) 和 Cat(cat)。
在 Cat 類中,我們看到對基類的構造函數的顯式調用。 它應該始終在構造函數的第一行。
下面是分配內存後發生的事情: 18 – 調用基類的構造函數。 3、4—— 初始化 Pet 中的變量。 8、9 – 執行 Pet 構造函數中的代碼。
然後Cat類開始初始化。 14 – 初始化 Cat 中的變量 19 – 執行 Cat 構造函數中的代碼 |
public static void main(String[] args)
{
Cat cat = new Cat (50, 50, 5);
}
|
|
“這有點令人困惑。為什麼這麼複雜?”
“如果你知道到底發生了什麼,其實並不難:”
如果一個類沒有任何構造函數,則會自動創建一個。
默認構造函數 |
|
class Cat
{
int x = 5;
int y = 5;
}
|
class Cat
{
int x = 5;
int y = 5;
public Cat()
{
}
}
|
如果不調用基類構造函數,會自動調用。
調用基類的構造函數 |
|
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();
}
}
|
成員變量在構造函數中初始化。
成員變量的初始化 |
|
class Cat
{
int x = 5;
int y = 5;
}
|
class Cat
{
int x;
int y;
public Cat()
{
super();
this.x = 5;
this.y = 5;
}
}
|
到底發生了什麼 |
|
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;
}
}
|
“現在更清楚了:首先是基類,然後是構造函數之外的變量,然後是構造函數代碼。”
“幹得好,阿米戈!就是這樣!”
GO TO FULL VERSION