java建構函式能否被繼承,為什麼? ?
java建構函式能否被繼承,為什麼?
不能,因為子類繼承父類的時候,先執行父類建構函式;具體的說就是執行父類時就會先“呼叫”父類的建構函式,注意“呼叫”和繼承不是一個含義,實質上是“自動執行”。
繼承(extends)的含義其實是“擴充套件”,子類完全沒必要擴充套件父類的建構函式,因為反正每次調子類的時候都會“自動執行”它父類的建構函式,如果真的需要子類建構函式特殊的形式,子類直接修改或過載自己的建構函式就好了。
估計是你龔“建構函式”的意義本身不理解,“呼叫”一個類有“繼承”和“組合(說白了new 一個類)”兩種方式,當你“呼叫”一個類的時候就會“自動執行”它的“建構函式”。
java中,子類能不能繼承父類的構造方法??
你老師是對的,不過一下子說不清楚。給你個例子。
class A{
public A(){} // 1:無引數構造方法。
public A(String s){} // 2.
}
class B extends A{
public B(String s){
super(s); // 3.
}
}
說明:如果沒有1處的無引數構造方法,那麼3處一定要主動呼叫父類帶引數的構造方法。
如果有1處的構造方法,那麼3處程式碼可以不要,因為Java會自動預設呼叫父類的無引數構造方法。
記住一點:在構造子類時,一定會呼叫到父類的構造方法。
所以父閥要麼有一個預設的無引數構造,這樣Java會自動呼叫這個無引數的構造。如果父類沒有無引數的構造,那麼就要你自己在子類的構造中,通過super()的方式呼叫父類的構造。
java的繼承中的構造方法
java繼承中對建構函式是不繼承的,只是呼叫(隱式或顯式)。
舉例說明:
public class FatherClass {
public FatherClass() {
System.out.println(100);
}
public FatherClass(int age) {
System.out.println(age);
}
}
public class SonClass extends FatherClass{
public SonClass() {
}
public SonClass(int c) {
撫 System.out.println(1234);
}
public static void main(String[] args) {
SonClass s = new SonClass(66);
}
}
編譯後執行結果如下:
分析:SonClass s = new SonClass(66);
執行這句時,呼叫
public SonClass(int c) {
System.out.println(1234);//系統會自動先呼叫父類的無參建構函式(super())
}
在這個建構函式中,等價於
public SonClass(int c) {
super();//必須是第1行,否則不能編譯
System.out.println(1234);
}
所以結果是 100 1234
在建立子類的物件時,Java虛擬機器首先執行父類的構造方法,然後再執行子類的構造方法。在多級繼承的情況下,將從繼承樹的最上層的父類開始,依次執行各個類的構造方法,這可以保證子類物件從所有直接或間接父類中繼承的例項變數都被正確地初始化。
3.如果子類建構函式是這樣寫的
public SonClass(int c) {
super(22);//必須是第1行,否則不能編譯
//顯式呼叫了super後,系統就不再呼叫無參的super()了;
System.out.println(1234);
}
執行結果是 22
1234
總結1:建構函式不能繼承,只是呼叫而已。
如果父類沒有無參建構函式
建立子類時,不能編譯,除非在建構函式程式碼體中第一行,必須是第一行顯式呼叫父類有參建構函式
如下:
SonClass (){
super(777);//顯示呼叫父類有參建構函式
System.out.println(66);
}
如果不顯示呼叫父類有參建構函式,系統會預設呼叫父類無參建構函式super();
但是父類中沒有無參建構函式,那它不是不能呼叫了。所以編譯就無法通過了。
總結2:建立有參建構函式後,系統就不再有預設無參建構函式。
如果沒有任何建構函式,系統會預設有一個無參建構函式。...
建構函式可以繼承嗎?
建構函式是可以繼承的
但是建構函式不能被顯示的呼叫的
,由於你的有引數要傳遞所以要這樣呼叫才行
#include
class A
{
public:
A(int &x)
{
s=x;
}
int getS()
{
return s;
}
private:
int s;
};
class B:public A
{
public:
B::B(int x):A(x)
{}
void print()
{
cout<
}
};
void main()
{
B b(2);
b.print();
}
你可以用一個PRINTF語句去測試他們的執行的
java中一個子類是否可以繼承父類的構造方法
構造方法不會被繼承,當子類例項化時會自行先去找父類構造方法,之後再找自身構造方法。程式碼說明(java為例)
父類class person{ public person { //父類構造方法 System.out.println("我是父類無參構造方法"); }}public class student extends person{ public static void main(String[] args) { //例項化student student stu1 = new student(); }}//執行上述程式碼,在控制檯輸出:我是父類無參構造方法
關於繼承構造方法的問題
子類繼承父類的話,當子類被實力化就會去呼叫父類的預設構造方法.這是不可改變的.如果你不想顯示這些值,就把預設的構造方法裡的程式碼都去掉.
另一種情況就是,你在實力化的時候傳一些引數進去,就不會呼叫預設的構造函數了.前提是你傳的引數要有相應的建構函式來匹配.
如果又想呼叫預設的建構函式的話,就用super();
java中子類不寫構造方法而父類寫構造方法,子類繼承了父類哪個構造方法?
您好,提問者: 太不專業了,構造方法怎麼會存在繼承?
不寫預設的有個隱士的構造方法,舉個例子吧:
class A{ void add();}public class B extends A{ public B(){ super(); //這個super也是隱士的。 }}//如何知道有個預設的super()呢?看下面程式碼class AA{ public AA{ System.out.println("super()"); }}public class BB extends AA{ public static void main(String[] args){ new BB(); //輸出super(); }}
繼承關係下,構造方法的呼叫規則有哪些?
第一個規則:子類的構造過程中,必須呼叫其父類的構造方法。一個類,如果我們不寫構造方法,那麼編
譯器會幫我們加上一個預設的構造方法,所謂預設的構造方法,就是沒有引數的構造方法,但是如果你自己寫
了構造方法,那麼編譯器就不會給你添加了,所以有時候當你new一個子類物件的時候,肯定呼叫了子類的構
造方法,但是在子類構造方法中我們並沒有顯示的呼叫基類的構造方法,就是沒寫,如:super(); 並沒有這樣
寫,但是這樣就會呼叫父類沒有引數的構造方法,如果父類中沒有沒有引數的構造方法就會出錯。
第二個規則:如果子類的構造方法中沒有顯示的呼叫基類構造方法,則系統預設呼叫基類無引數的構造方
法注意:如果子類的構造方法中既沒有顯示的呼叫基類構造方法,而基類中又沒有預設無參的構造方法,則編
譯出錯,所以,通常我們需要顯示的:super(引數列表),來呼叫父類有引數的建構函式。
java父類的構造方法為什麼不能被子類繼承
子類=父類﹢新增的變數﹢新增的方法。物件語言的構造器作用在於對類建立例項物件時完成物件的初始化工作(為變數申請記憶體空間等)
因此,子類川構造器除了承擔著初始化子類的新增變數和方法,還要初始化父類自身新增加的變數和方法。一般來說,如果在子類的構造器中沒有使用super()呼叫父類相應的構造器,子類的構造器會自動呼叫父類預設的,也就是不帶引數的構造器來初始化父類的東西。
而Java類的預設構造器,當你沒有為你寫的類建造構造器的時候,Java會自動幫你建立這個預設構造器,但是當你自己編寫了構造器後,你自己編寫構造器將會覆蓋掉預設的構造器,就是說預設的構造器不存在。那麼這個時候,你在繼承的子類裡面沒有顯示新增super()函式呼叫你在父類裡編寫的父類構造器,子類的構造器將不能自動找到父類的構造器。找不到父類的構造器意味著什麼?意味著你的子類例項化的時候找不到父類的構造器來初始化父類的東西,不能完成類例項物件的初始化工作,你說你的子類能不出現錯誤?!
所以,在子類的構造器中需不需要新增super()呼叫父類相應的構造器,只需要考慮子類的構造器才初始化的時候能不能完成所有變數和方法的初始化就可以了。另外,根據自己初始化工作的需要使用super()呼叫相應的父類構造器來初始化也是有必要的。
所以你所說的子類不能繼承父類構造器,這說明你沒有顯式的呼叫seper(),而且父類構造器被你的子類覆蓋或呼叫的父類中沒有無參構造器所引起的。
Java繼承中的構造方法問題
你好,很高興為你解答。
這段程式碼提示B的建構函式錯誤。這是因為B繼承A,B的建構函式會自動呼叫A的預設建構函式(即不帶引數的建構函式),但A沒有定義預設建構函式,所以就會報錯。有兩種改法:
1)在A中增加預設建構函式。如下:
class A {
int a;
String name;
String sex;
A(){ //修改這兒
}
A(int a, String name, String sex) {
this.a = a;
this.name = name;
this.sex = sex;
}
void ShowMess() {
}
}
class B extends A {
int age;
B(int a, String name, String sex, int age) {
this.a=a;
this.name=name;
this.sex=sex;
this.age=age;
this.age = age;
}
void ShowMess() {
System.out.println("a+name+sex+age");
}
}
2)修改B的建構函式,顯式地呼叫A的非預設建構函式。如下:
class A {
int a;
String name;
String sex;
A(int a, String name, String sex) {
this.a = a;
this.name = name;
this.sex = sex;
}
void ShowMess() {
}
}
class B extends A {
int age;
B(int a, String name, String sex, int age) {
super(a,name,sex); //修改這兒
this.age = age;
}
void ShowMess() {
System.out.println("a+name+sex+age");
}
}