子類繼承父類的建構函式(方法)嗎?
最近我看見有人問過這個問題。在此我想表達一下自己的觀點。
根據物件導向中關於繼承這個概念——子類繼承父類所有的屬性和方法。那麼既然是所有的那麼本人認為也應當也包括建構函式(方法)。
我先舉一個C++的例子:
class Parent
{
private:
int p;
public:
Parent(void) : p(0)
{
}
Parent(int i) : p(i)
{
}
};
class Child : public Parent
{
private:
int c;
public:
Child(void) : Parent(), c(0)
{
// 在這裡,建立Child物件時先構造父類域
}
Child(int i) : Parent(i + 1), c(i)
{
// 同上
}
};
{
private:
int p;
public:
Parent(void) : p(0)
{
}
Parent(int i) : p(i)
{
}
};
class Child : public Parent
{
private:
int c;
public:
Child(void) : Parent(), c(0)
{
// 在這裡,建立Child物件時先構造父類域
}
Child(int i) : Parent(i + 1), c(i)
{
// 同上
}
};
如何證明Child類繼承了Parent類的兩個建構函式呢?
由於建構函式非常特別,對它的呼叫就像是呼叫一個C函式一樣,而不是利用物件來呼叫的(若不先構造物件哪兒來的物件?)。因此鑑於這份特殊性我們可以這麼考慮:
將上述程式碼中class Child : public Parent——去掉“: public Parent”,我們可以編譯試試,是否能成功。事實上正是因為Parent與Child有親子關係,所以Child建構函式中可以呼叫Parent的建構函式先對其Parent域進行初始化。這個特點非常符合工程學——詳見我的文章《我比起Java更喜歡C++的理由——語義》。
下面將貼出相應的Java程式碼:
class Parent {
private int p;
public Parent() {
p = 0;
}
public Parent(int i) {
p = i;
}
}
class Child extends Parent {
private int c;
public Child() {
super();
c = 0;
}
public Child(int i) {
super(i + 1);
c = i;
}
}
private int p;
public Parent() {
p = 0;
}
public Parent(int i) {
p = i;
}
}
class Child extends Parent {
private int c;
public Child() {
super();
c = 0;
}
public Child(int i) {
super(i + 1);
c = i;
}
}
我們可以看到,在Java中可以利用super關鍵字來訪問本類父類的構造方法。這樣在一定程度上也消除了歧異性——比如你也可以在Child類中的某一個方法中這麼寫:Parent p = new Parent();而利用super()就表示了子類在初始化本類域前先初始化其父類域。這也可以證明在Java中子類繼承父類構造方法,並且子類可以通過 super來訪問父類的構造方法,只要父類的構造方法不是private。
相關文章
- 類的繼承_子類繼承父類繼承
- 在 C++ 中子類繼承和呼叫父類的建構函式方法C++繼承函式
- 在C++中子類繼承和呼叫父類的建構函式方法C++繼承函式
- c# abstract抽象類與繼承類子類的建構函式_baseC#抽象繼承函式
- 父類和子類的建構函式問題函式
- C# 繼承 子類(派生類) 父類(基類)C#繼承
- 子類繼承父類(父類和子類裡:塊、靜態塊、構造和方法覆寫)之間呼叫順序繼承
- java關於繼承父類,需要實現父類中的構造方法Java繼承構造方法
- es5建構函式,es6類和類的繼承函式繼承
- 19-父類的建構函式函式
- 子父類中函式函式
- 區分:派生類指定基類建構函式、繼承構造、委託構造函式繼承
- python3父類需要繼承object嗎?Python繼承Object
- js建構函式的繼承JS函式繼承
- 繼承中的建構函式繼承函式
- Java建構函式的繼承Java函式繼承
- Javascript繼承2:建立即繼承—-建構函式繼承JavaScript繼承函式
- 原型繼承:子類原型繼承
- C#建構函式繼承C#函式繼承
- c# 繼承派生類的預設建構函式的初始化次序C#繼承函式
- C#介面、抽象類、普通類和繼承(子類與父類)都有其特定的用途和場景C#抽象繼承
- Java建構函式的繼承問題Java函式繼承
- 建構函式的繼承問題 (轉)函式繼承
- 類的建構函式和解構函式函式
- iOS 繼承&類方法iOS繼承
- JS原型繼承和類式繼承JS原型繼承
- 建構函式、原型、原型鏈、繼承函式原型繼承
- day-25-類的繼承順序-父類對子類的約束-多型-佇列和棧繼承多型佇列
- 子承父業-C#繼承C#繼承
- C++知識點49——類繼承與類的構造、拷貝、operator=和解構函式C++繼承函式
- 建構函式的prototype與各種繼承函式繼承
- 鏈式-父類中返回子類物件物件
- 類的繼承繼承
- 父類與子類之間靜態函式的呼叫以及函式引數的傳遞函式
- java容器類的繼承結構Java繼承
- javascript建構函式的繼承簡單介紹JavaScript函式繼承
- C++ 類建構函式和解構函式C++函式
- [JavaScript]原型、原型鏈、建構函式與繼承JavaScript原型函式繼承