導航:首頁 > 編程語言 > java抽象構造函數

java抽象構造函數

發布時間:2024-12-18 01:13:49

❶ 抽象類有構造方法嗎

問題一:java抽象類中的構造方法作用??如何理解? java抽象類的構造方法和普通類的構造方法一樣
都是用來初始化類
只是抽象撫的構造方法不能直接調用 因為抽象類不能實現實例
但是一旦一個普通類繼承了抽象類 便也可以在構造函數中調用其抽象類的構造函數
也可以使用其方法
可以這么理解吧 抽象類就是一個不能實例化的不同類
不過如果方法加了abstract那麼就必須在子類裡面重寫了

問題二:為什麼抽象類有構造方法,介面卻沒有構造方法 抽象類設計出來是用來實現多態(動態綁定),而且抽象類中可以有函數的具體實現。
而介面不提供任何具體實現,它被設計出來用來允許你通過創建一個能夠被向上轉型為不止一種基灶哪碼類型的類,來實現一種C++多重繼承(multiple inheritance 的變種。

問題三:java中,抽象類可以有構造方法嗎 抽象類可以有構造方法,只是不能直接創建抽象類的實例對象而已。

問題四:新手~~java抽象類構造方法問題 Cat myCat = new Cat(myCat); 你右邊作為構造函數傳入的myCat是個啥?你的程序里要求的是String類型,是不是考慮改成Cat myCat = new Cat(myCat);

問題五:java中,抽象類可以有構造方法嗎 可以有構造方法。構造方法的作用有兩個,一個是初始化變數,另外一個是實例化對象,抽象類不能實例化,還可以做另外一個作用。

問題六:一個抽象類中有構造方法有什隱哪么用 可以被子類的構造方法調用,否則子類為抽象父類載入私有屬性會很麻煩

問題七:抽象類中有構造函數嗎?抽象類中有構造函數嗎?抽象類中有構造函數嗎 建議你看一下網路文庫中的解密高考抽象函數文章
wenku./..._t1y4_

問題八:java的抽象類中父類一定緩羨要含無參構造函數嗎 不一定,但是一定要有一個構造函數,有參無參都可以
構造函數是對象的基本,沒有構造函數就沒有對象。
若果在父類中(這里就是你的抽象類)中顯示的寫了有參數的構造函數,在子類繼承就必須寫一個構造函數來調用父類的構造函數
例子: abstract class Person { 定義一個抽象類,必須被繼承

Person(int i) {

}
}
public class Student extends Person {

Student() {
super(int i):必須顯示的調用父類構造方法super代表父類對象
}
}
如果父類中有沒有參數的構造函數,在子類中可以不顯示的寫父類的構造函數,Java會自動調用沒有參數的構造函數
例子:
abstract class Person { 定義一個抽象類,必須被繼承

Person() { 此構造函數也可以不寫,Java會默認添加一個沒有參數的構造函數

}
}
public class Student extends Person {

Student() {
super();可以不寫,Java會自己調用這個super()方法
}
}

問題九:抽象類中定義構造方法後,繼承它的子類中也必須要寫出構造方法嗎 1.抽象類也是類,只不過本身不能實例化,要通過子類實例化。
2.是類就有構造方法,如果我們沒有給出構造方法,系統將自動提供一個無參構造方法,如果我們給出了構造方法,系統將不會提供。
3.子類中所有的構造方法默認都會訪問父類中空參構造方法--->也就是說,子類new對象的時候,先去父類中逛了互圈,完成了父類的初始化(父類初始化值存在子類new對象開辟堆內存的某塊地方)(再說白點,每一個構造方法的第一條語句默認是super(),有參也是)
4.那麼問題來了,要是父類沒有無參構造呢?
不會有人認為父類沒有構造方法啦?。。。
系統會默認加的(前面有提到),這里是指父類手動寫了有參構造,子類繼承要加super(值)或是this(值),從而子類繼承的時候就要寫出構造方法,再加上this(值)或是super(值)
5.繼承注意:子類不能繼承父類的構造方法,但是可以通過super關鍵字去訪問父類
懵逼了吧,話說從學習java到放棄java

❷ Java中構造函數是什麼它應該具體怎麼用呢

是構造方法,不是構造函數,後者是C++的概念

首先要注意的是Java的構造器並不是函數,所以他並不能被繼承,這在我們extends的時候寫子類的構造器時比較的常見,即使子類構造器參數和父類的完全一樣,我們也要寫super就是因為這個原因。
構造器的修飾符比較的有限,僅僅只有public private protected這三個,其他的例如任何修飾符都不能對其使用,也就是說構造器不允許被成名成抽象、同步、靜態等等訪問限制以外的形式。
因為構造器不是函數,所以它是沒有返回值的,也不允許有返回值。但是這里要說明一下,構造器中允許存在return語句,但是return什麼都不返回,如果你指定了返回值,雖然編譯器不會報出任何錯誤,但是JVM會認為他是一個與構造器同名的函數罷了,這樣就會出現一些莫名其妙的無法找到構造器的錯誤,這里是要加倍注意的。

在我們extends一個子類的時候經常會出現一些意想不到的問題,我在這里說一些和構造器有關的。
首先說一下Java在構造實例時的順序(不討論裝載類的過程)
構造的粗略過程如下
1、分配對象空間,並將對象中成員初始化為0或者空,java不允許用戶操縱一個不定值的對象。
2、執行屬性值的顯式初始化(這里有一點變化,一會解釋,但大體是這樣的)
3、執行構造器
4、將變數關聯到堆中的對象上

介紹一下准備知識,以備一會來詳細說明這個的流程
this() super()是你如果想用傳入當前構造器中的參數或者構造器中的數據調用其他構造器或者控制父類構造器時使用的,在一個構造器中你只能使用this()或者super()之中的一個,而且調用的位置只能在構造器的第一行, 在子類中如果你希望調用父類的構造器來初始化父類的部分,那就用合適的參數來調用super(),如果你用沒有參數的super()來調用父類的構造器(同時也沒有使用this()來調用其他構造器),父類預設的構造器會被調用,如果父類沒有預設的構造器,那編譯器就會報一個錯誤,注意此處,我們經常在繼承父類的時候構造器中並不寫和父類有關的內容,此時如果父類沒有預設構造器,就會出現編譯器添加的預設構造器給你添麻煩的問題了哦。例如:Class b extends a{public b(){}}就沒有任何有關父類構造器的信息,這時父類的預設構造器就會被調用。

舉個SL-275中的例子
1 public class Manager extends Employee {
2 private String department;
3
4 public Manager(String name, double salary, String dept)
{
5 super(name, salary);
6 department = dept;
7 }
8 public Manager(String n, String dept) {
9 super(name);
10 department = dept;
11 }
12 public Manager(String dept) { // 這里就沒有super(),編譯器會自動地添加一個空參數的預設super構造器,此時如果Employee類中沒有空參數的預設構造器,那就會導致一個編譯錯誤
13 department = d;
14 }
15 }

你必須在構造器的第一行放置super或者this構造器,否則編譯器會自動地放一個空參數的super構造器的,其他的構造器也可以調用super或者this,調用成一個遞歸構造鏈,最後的結果是父類的構造器(可能有多級父類構造器)始終在子類的構造器之前執行,遞歸的調用父類構造器

在具體構造類實例的過程中,上邊過程的第二步和第三步是有一些變化的,這里的順序是這樣的,分配了對象空間及對象成員初始化為默認值之後,構造器就遞歸的從繼承樹由根部向下調用,每個構造器的執行過程是這樣的:
1、Bind構造器的參數
2、如果顯式的調用了this,那就遞歸調用this構造器然後跳到步驟5
3、遞歸調用顯式或者隱式的父類構造器,除了Object以外,因為它沒有父類
4、執行顯式的實例變數初始化(也就是上邊的流程中的第二步,調用返回以後執行,這個步驟相當於在父構造器執行後隱含執行的,看樣子像一個特殊處理)
5、執行構造器的其它部分

這里的步驟很重要哦!!!!!

從這個步驟中可以很明顯的發現這個實例初始化時的遞歸調用過程,估計看過這個你應該能夠理解這個遞歸構造鏈是怎麼樣回事了。

這里還是給出SL-275中的一個例子,讓你充分理解一下這個遞歸的過程。

public class Object {
...
public Object() {}
...
}
public class Employee extends Object {
private String name;
private double salary = 15000.00;
private Date birthDate;
public Employee(String n, Date DoB) {
// implicit super();
name = n;
birthDate = DoB;
}
public Employee(String n) {
this(n, null);
}
}

public class Manager extends Employee {
private String department;
public Manager(String n, String d) {
super(n);
department = d;
}
}

在創建Manager("Joe Smith","Sales"):時,步驟如下
0 basic initialization
0.1 allocate memory for the complete Manager object
0.2 initialize all instance variables to their default values (0 or null)
1 call constructor: Manager("Joe Smith", "Sales")
1.1 bind constructor parameters: n="Joe Smith", d="Sales"
1.2 no explicit this() call
1.3 call super(n) for Employee(String)
1.3.1 bind constructor parameters: n="Joe Smith"
1.3.2 call this(n, null) for Employee(String, Date)
1.3.2.1 bind constructor parameters: n="Joe Smith", DoB=null
1.3.2.2 no explicit this() call
1.3.2.3 call super() for Object()
1.3.2.3.1 no binding necessary
1.3.2.3.2 no this() call
1.3.2.3.3 no super() call (Object is the root)
1.3.2.3.4 no explicit variable initialization for Object
1.3.2.3.5 no method body to call
1.3.2.4 initialize explicit Employee variables: salary=15000.00;注意:在父構造器返回後子類才會初始化實例變數的值。
1.3.2.5 execute body: name="Joe Smith"; date=null;
1.3.3 - 1.3.4 steps skipped
1.3.5 execute body: no body in Employee(String)
1.4 no explicit initializers for Manager
1.5 execute body: department="Sales"

這個流程就說明了一切,這個步驟是要注意的。一會還有些內容是要涉及到這里的。

寫在後邊的一些在使用構造器中的注意事項。

一、構造器中一定不要創建自身的實例,否則會造成調用棧溢出錯誤。這個規則也適用於對象的實例變數,如果對象中有自身的引用,這個引用一定不能在定義中或者構造器中初始化。

class a
{
a _a = new a();

public a()
{
_a = new a();
a _b = new a();
}
}

以上三種情況都會造成棧溢出,呵呵,這樣會造成一個無窮遞歸的調用棧。

二、如果父類是一個抽象類,那通過調用父類的構造器,也可以將它初始化,並且初始化其中的數據。
三、如果你要在構造器中調用一個方法時,將該方法聲明為private。
對於這個規則是需要一些說明的,假使你的父類構造器中要調用一個非靜態方法,而這個方法不是private的又被子類所重載,這樣在實際創建子類的過程中遞歸調用到了父類的構造器時,父類構造器對這個方法的調用就會由於多態而實際上調用了子類的方法,當這個子類方法需要用到子類中實例變數的時候,就會由於變數沒有初始化而出現異常(至於為什麼子類中的實例變數沒有初始化可以參考上邊的實例初始化過程),這是Java不想看到的情況。而當父類構造器中調用的方法是一個private方法時,多態就不會出現,也就不會出現父類構造器調用子類方法的情況,這樣可以保證父類始終調用自己的方法,即使這個方法中調用了父類中的實例變數也不會出現變數未初始化的情況(變數初始化總是在當前類構造器主體執行之前進行)。

❸ java中,抽象類可以有構造方法嗎

抽象類可以有構造方法,只是不能直接創建抽象類的實例對象而已。

在繼承了抽象類的子類中通過super(參數列表)調用抽象類中的構造方法

示例代碼如下:

❹ java,,,一個介面為什麼不可以繼承抽象類

介面里的方法是不能有方法身體的,但抽象類的方法是可以有方法體的,繼承後,在這一點上就會產生矛盾.
抽象類的方法體無法存在了呀

閱讀全文

與java抽象構造函數相關的資料

熱點內容
豐田app智行互聯怎麼收費 瀏覽:972
命令奶奶讓座 瀏覽:866
mp3編譯方法 瀏覽:124
android得到當前activity 瀏覽:941
編譯源程序是什麼 瀏覽:542
javaxml轉html 瀏覽:110
java二維數組遍歷 瀏覽:402
qt58linux安裝 瀏覽:372
matlab編譯注意事項 瀏覽:817
隨機賦值JAVA 瀏覽:718
甲類氣體壓縮機 瀏覽:740
壓縮真空封口機 瀏覽:814
一年級數學快速口演算法 瀏覽:324
安卓上搭建編譯環境 瀏覽:843
linux復制字元串 瀏覽:333
卡夫卡pdf 瀏覽:729
wordpdf列印機 瀏覽:174
玩吧app怎麼扔骰子 瀏覽:655
文件夾的ip地址怎麼看 瀏覽:418
三維繪圖命令 瀏覽:864