『壹』 java抽象類中的構造方法作用如何理解
/*學好java基礎,學深java基礎,才能走的更遠(為什麼呢?網路有更好的解釋),願我們共同探討學習,用通俗易懂的話語來了解java
1.抽象類也是類,只不過本身不能實例化,要通過子類實例化。
2.是類就有構造方法,如果我們沒有給出構造方法,系統將自動提供一個無參構造方法,如果我們給出了構造方法,系統將不會提供。
那麼問題來了,為什麼非得有構造方法呢?
構造方法(函數)的作用:(1)用於創建對象,初始化參數;(2)接受子類傳來的參數,初始化參數,子類堆內存的某塊位置存放父類的初始化參數
那麼問題又來了,問題1:抽象類有構造方法怎麼不能創建對象?問題2:它與介面又有什麼關系呢?
問題1:請看構造函數的作用,還要補充下,用抽象類就要寫個繼承它的子類,然後通過父類引用指向子類這也是多態的表現,Father f = new Son();引用地址f就可以調用抽象類中的一般方法;
那麼問題又來了抽象類怎麼訪問子類的方法呢?好了,自己考慮去
對於抽象類和一般類,介面來個例子
話說我去蘭州拉麵館吃面,拿著菜單
抽象類的說法:
我:老闆來碗面
老闆:你需要什麼面?
我:就是面啊?---------->描述抽象,既然抽象類都這么抽象了,那它有什麼作用呢?簡單來 說,就是抽取某個類的共性功能,方便分類調用(編程就需要邏輯思維清晰,可讀性強,就像書為什麼要目錄);舉個例子,假如有哥們想吃面,想吃辣點的(面的共性辣),就快速選個方向去四川面館,到了面館就有查渣面,雞絲涼面(具體類)選擇...
老闆:...
類的說法:
我:老闆來碗面
老闆:你需要什麼面?
我:油潑面 ------------>描述具體
介面:從廣義的角度講對外提供規則的都是介面,來個例子
話說你家大門鎖,你可以用匹配的鑰匙打開鎖,可我不一定非得要用你那型號的鑰匙去開你家大門,我可以用鐵絲就可以了,想想,實際生活中當真可以么,去問盜賊,他們"介面"倒是學的不賴
為什麼用鐵絲也可以開門呢?因為實現了鎖孔內幾個頂針同時頂上然後什麼什麼的方法,現在我們來看,我們可以用鑰匙這個對象可以開鎖,用鐵絲這個對象開鎖,他們共同的特點就是實現了
開鎖的一些規則要求,也就是實現了開鎖的要求的方法
需要說明的是:介面是沒有構造方法的,它只是用來對外提供規則,其他類都可以實現這個介面,重寫裡面的方法
問題2:抽象類和介面的關系?
一般類繼承抽象類,extends
一般類也可繼承一般類 ----->類與類可以繼承,單繼承,兒子和父親的關系(一個兒子不能來自兩個父親的基因,能嗎?)
一般類和抽象類可以實現一個或多個介面,implements--->....干兒子和乾爹的關系
那麼問題來了:有沒有人有個奇葩的問題,介面可不可以有父親?乾爹呢?
......收住,回到正題
3.子類中所有的構造方法默認都會訪問父類中空參構造方法-->為什麼呢?
因為子類會繼承父類中的數據,可能還會使用父類的數據,
所以,子類初始化之前,一定要先完成父類數據的初始化。
4.那麼問題來了,要是父類沒有無參構造呢?
不會有人認為父類沒構有造方法吧?。。。
系統會默認加的(前面有提到),這里是指父類手動寫了有參構造,子類繼承也要手動寫出構造方法(請看下面例子)
5.繼承的注意事項
(1):子類只能繼承父類所有非私有的成員(成員方法和成員變數)--->皇帝老兒的妃子,你太子能繼承享用,恩...只代表大眾的想法,特殊的除外,不鑽牛角尖
(2):子類不能繼承父類的構造方法,但是可以通過super關鍵字去訪問父類構造方法。
*/
/* 1.父類沒有無參構造方法,子類怎麼辦?
super解決
this解決
2.注意事項
super(…)或者this(….)必須出現在構造方法的第一條語句上
*/
class test{
public static void main(String[] args) {
Son son = new Son("張三",23);
System.out.print(son.name+":"+son.age);
}
}
class Father {
String name="李四"; //姓名
int age=24; //年齡
/*public Father() { //空參構造
System.out.println("Father 空參構造");
}*/
public Father(String name,int age) { //有參構造
//super(); 系統默認的,你知道是繼承誰的嗎? 最高父類Object
this.name = name;
this.age = age;
}
public void setName(String name) { //設置姓名
//super(); 系統默認的,你知道是繼承誰的嗎?最高父類Object
this.name = name;
}
public String getName() { //獲取姓名
return name;
}
public void setAge(int age) { //設置年齡
this.age = age;
}
public int getAge() { //獲取年齡
return age;
}
}
class Son extends Father {
//String name = "張三";
//int age=23;
/*public Son() { //由於父類沒有無參構造(子類不繼承父類構造放法),但是可以通過加this(值)或super(值)去訪問父類構造方法
//super(); 系統默認的,你知道是繼承誰的嗎?可惜上面 Father類沒有無參構造
//this(name,age); //注意,這種寫法錯誤,雖然name,和age為成員變數,但是,無參構造方法沒有參數傳進來,(說到底無參構造方法終究還是個方法而已)
this("張三",23); //這種方法可以,為什麼?因為它會在本類中尋找有參構造,通過 super(name,age)將值傳入父類(因為父類只有有參構造)
//留下個疑問?要是下面有參構造,形參少了參數,即public Son(String name){ super(name,age);}還起作用嗎?試試
//super(name,age); //同上
super("李四",24); //同上,注意this(值)和super(值)不能同時在構造方法的第一條語句上,但系統默認super()除外
}
public Son(String name,int age) {
//super(name);
//super(); 系統默認的,你知道是繼承誰的嗎?可惜上面 Father類沒有無參構造
super(name,age);
System.out.print(name+":"+age);
}
}
//子類構造方法另外種寫法對嗎?
class test{
public static void main(String[] args) {
Son son = new Son("王五");
System.out.print(son.name+":"+son.age);
}
}
class Father {
String name; //姓名
int age; //年齡
/* public Father() { //空參構造
System.out.println("Father 空參構造");
}
*/
public Father(String name,int age) { //有參構造
//super(); 系統默認的,你知道是繼承誰的嗎? 最高父類Object
this.name = name;
this.age = age;
}
public void setName(String name) { //設置姓名
//super(); 系統默認的,你知道是繼承誰的嗎?最高父類Object
this.name = name;
}
public String getName() { //獲取姓名
return name;
}
public void setAge(int age) { //設置年齡
this.age = age;
}
public int getAge() { //獲取年齡
return age;
}
}
class Son extends Father {
//String name = "張三";
//int age=23;
/* public Son() { //由於父類沒有無參構造(子類不繼承父類構造放法),但是可以通過加this(值)或super(值)去訪問父類構造方法
//super(); 系統默認的,你知道是繼承誰的嗎?可惜上面 Father類沒有無參構造
//this(name,age); //注意,這種寫法錯誤,雖然name,和age為成員變數,但是,無參構造方法沒有參數傳進來,(說到底無參構造方法終究還是個方法而已)
this("張三",23); //這種方法可以,為什麼?因為它會在本類中尋找有參構造將值傳入父類(因為父類只有有參構造)
//留下個疑問?要是下面有參構造,形參少了參數,即public Son(String name){ super(name,age);}還起作用嗎?試試
//super(name,age); //同上
super("李四",24); //同上,注意this(值)和super(值)不能同時在構造方法的第一條語句上,但系統默認super()除外
}*/
public Son(String name) { //我們說子類不繼承父類的構造方法,也可以這樣寫對嗎?
//super(name);
//super(); 系統默認的,你知道是繼承誰的嗎?可惜上面 Father類沒有無參構造
super(name,24);
System.out.print(name+":"+age);
}
}
//就寫這么多吧,不斷的為什麼,我都要瘋了,有錯誤的和遺漏的希望指正
『貳』 java中的構造方法是用來幹嘛的怎麼就想到要用構造方法我寫的時候想不到要寫
構造方法就是用來構造一個對象出來的。
一個對象通常有很多屬性,這些屬性通常是定義為private訪問級別的,通常定義了public 的GET SET方法,操作這些屬性。
當new 一個無參數的對象,即調用默認構造方法,這些屬性的值一般就是為空的。
當調用帶參數的構造方法的時候 一般我們是給一些屬性賦值。
所以當你想初始化NEW出來的對象有些值的時候就去調用你自己定義的帶參數構造方法。
其實不難理解 吧 親再好好地去學習一下!