❶ java中什麼是構造方法及其作用
無意中翻到這條提問,看了很多回答,發現歧義較重,在這里解答一下,為了避免後邊來的朋友們踩雷
新手學習Java在構造方法這里很容易踩雷,構造方法是用來初始化的,這句勉強沒錯,可構造方法是用來創建對象的,這句就錯了,實際上,在構造方法執行之前,類的內存空間已經開辟完成了,意思就是說對象已經創建了,這步是由new關鍵字來完成的,而構造方法的作用是給類中的變數進行初始化賦值
假設,假設構造方法是用來創建對象用的,就無法解釋抽象類中為什麼允許構造方法的存在,抽象類無法實例化,不能被創建,但是抽象類中允許構造方法的存在,舉例從側面證明一下:
abstract class Animal{
String name;
public Animal() {
System.out.println("抽象父類的無參構造");
}
abstract void eat();
}
class Dog extends Animal{
public Dog() {
super();
System.out.println("子類的無參構造");
}
@Override
void eat(){
}
}
public class Test {
public static void main(String[] args) {
Dog d = new Dog();
System.out.println(d.name);
}
}
隨手敲的很簡陋的一段代碼,不要在意格式上的不嚴謹,領會精神,這段代碼執行後的結果為:
抽象父類的無參構造
子類的無參構造
null
當執行Dog d = new Dog()這句代碼時,大致會分兩步,一是載入類,開辟類的內存空間,這是由new完成的,第二步執行構造方法,為類中的變數初始化賦值,在執行Dog的無參構造時,系統會默認調用父類的無參構造,也就是super(),super關鍵字是對該類的父類進行的引用,它並不是一個對象,這也是個難點,感興趣的可以去查一下,而super()這句代碼可以簡單理解為調用這個類的父類的無參構造
在上述代碼中,父類Animal是一個抽象類,而抽象類不可被實例化,如果構造方法的作用是創建對象,在這一步上邏輯就無法自洽,而實際情況是:抽象類執行了構造方法,但卻沒有創建對象,同時成員變數name也有了初始值null
❷ java中的構造方法是用來幹嘛的怎麼就想到要用構造方法我寫的時候想不到要寫
構造方法就是用來構造一個對象出來的。
一個對象通常有很多屬性,這些屬性通常是定義為private訪問級別的,通常定義了public 的GET SET方法,操作這些屬性。
當new 一個無參數的對象,即調用默認構造方法,這些屬性的值一般就是為空的。
當調用帶參數的構造方法的時候 一般我們是給一些屬性賦值。
所以當你想初始化NEW出來的對象有些值的時候就去調用你自己定義的帶參數構造方法。
其實不難理解 吧 親再好好地去學習一下!
❸ java中的構造方法是個什麼意思,為什麼一定通過它來為成員賦初值,直接賦不行嗎
構造方法就是上戶口,上戶口派出所必須要求你出示必要條件,男人還是女人,出生日期,父母姓名。這些必須是上戶口的時候必須具備的,否則上個空頭戶口那就亂套了。勢必是活不見人死不見屍。先開個空頭戶口,在讓你寫名字,這就意味著,你這個戶口可以是張三,還能是李四,到時候戶口起不到作用了。
❹ java中什麼叫構造方法
構造方法是一種特殊的方法,與一般的方法不同是:
1.構造方法的名字必須與定義他的類名完全相同,沒有返回類型,甚至連void也沒有。
2.構造方法的調用是在創建一個對象時使用new操作進行的。構造方法的作用是初始化對象。
3.不能被static、final、synchronized、abstract和native修飾。構造方法不能被子類繼承。
class RectConstructor{
double length;
double width;
double area(){
return length*width;
}
//下面這個方法就是所謂的構造方法,沒有返回值,方法名與類名相同~~~
RectConstructor(double width,double length){//帶參數的構造方法
this.length=length;
this.width=width;
}
}
其實構造方法就是為了給類中成員賦初值~~~~~~~~~~~~~
❺ java中如何構造和調用方法,請給個實例
你說的是構造方法還是構造一個方法? 構造方法是用來傳值的,生成對象的時候會自動運行默認的構造方法,當然也可以對其進行私有化。 如果是構造一個方法的話 你的意思應該是寫一個類 然後可以進行繼承 或者實現 來調用。
一下樓上的話!添加個實例說明下!
//這是一個測試類
class Test{
//這個是構造方法,在創建對象的時候會自動調用執行,當然這是個無參構造方法,
//如果需要還可以寫有參構造方法
public test(){}
public void method(){//里邊方法體}
//如果要調用這種實體方法必須通過new 的對象來調用如:new Test().method();
public static void method2(){//里邊方法體}
//如果要調用這種靜態方法,直接通過類名就可以調用如:Test.method2();
}
❻ 1. 說明什麼是構造方法,構造方法有哪些特點 2. 如果程序中有多個類時,如何來確定源程序文件的名稱
1
構造方法是完成實例初始化的一系列指令集。構造方法的特點是沒有返回類型,和類名字一抹一樣。
2
如果有多個類,如果有且只有一個public class,則必須和這個public class命名相同。如果沒有public,文件名隨意。注意java得擴展名是.java...
❼ java中什麼是構造方法
構造方法,就是java類實例化的時候調用的類裡面的一個方法來構造這個定義的實體。
在類中有不同的構造方法,通過傳入參數來區分,選擇不用構造方法來實例化這個實體
❽ iOS中構造方法和實例方法的區別
你好!
行為差異:構造方法,創建對象後自動調用構造方法,實例方法必須對象.實例方法進行調用。
功能差異:構造方法多用於初始化對象狀態,對屬性賦初值,實例方法用於實現某個功能
僅代表個人觀點,不喜勿噴,謝謝。
❾ 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中構造方法和普通方法的區別
1.構造函數的命名必須和類名完全相同;在java中普通函數可以和構造函數同名,但是必須帶有返回值。
2.構造函數的功能主要用於在類的對象創建時定義初始化的狀態.它沒有返回值,也不能用void來修飾.這就保證了它不僅什麼也不用自動返回,而且根本不能有任何選擇.而其他方法都有返回值.即使是void返回值,盡管方法體本身不會自動返回什麼,但仍然可以讓它返回一些東西,而這些東西可能是不安全的.
3.構造函數不能被直接調用,必須通過new運算符在創建對象時才會自動調用,一般方法在程序執行到它的時候被調用.
4.當定義一個類的時候,通常情況下都會顯示該類的構造函數,並在函數中指定初始化的工作也可省略,不過Java編譯器會提供一個默認的構造函數.此默認構造函數是不帶參數的.而一般方法不存在這一特點