Java編程中的構造函數(shù)詳細介紹
本文主要是為新手、對java語言感興趣的人和那些沒有系統(tǒng)學習過java基礎知識的人進行一個總結,在文章中對構造函數(shù)進行了較為詳細的說明和討論,也包含了我個人對于java面向對象中構造函數(shù)的一些看法。希望走在java學習道路上的同行者可以有一個較為清晰的認知和理解。當然僅為個人觀點,水平有限,不足之處,還請大家多多指出,互相交流學習。
1.構造函數(shù)的概念
很多java新手談到構造函數(shù)就會犯暈,我們先來看看什么是構造函數(shù)。
首先,構造函數(shù)是函數(shù)的一種特殊形式,特殊在哪里?構造函數(shù)中不需要定義返回類型(void是無需返回值的意思,請注意區(qū)分兩者),且構造函數(shù)的名稱與所在的類名完全一致,其余的與函數(shù)的特性相同,可以帶有參數(shù)列表,可以存在函數(shù)的重載現(xiàn)象。
2.構造函數(shù)的格式
了解了構造函數(shù)的基本概念,現(xiàn)在來寫一個構造函數(shù),希望大家可以了解、記憶其格式,通過實例發(fā)現(xiàn)其與普通函數(shù)的不同之處。
public class Demo{
private int num=0;
//無參構造函數(shù)
Demo()
{
System.out.println("constractor_run");
}
//有參構造函數(shù)
Demo(int num)
{
System.out.println("constractor_args_run");
}
//普通成員函數(shù)
public void demoFunction()
{
System.out.println("function_run");
}
}
在這里要說明一點,如果在類中我們不聲明構造函數(shù),JVM會幫我們默認生成一個空參數(shù)的構造函數(shù);如果在類中我們聲明了帶參數(shù)列表的構造函數(shù),JVM就不會幫我們默認生成一個空參數(shù)的構造函數(shù),我們想要使用空參數(shù)的構造函數(shù)就必須自己去顯式的聲明一個空參的構造函數(shù)。
3.構造函數(shù)的作用
通過開頭的介紹,構造函數(shù)的輪廓已經漸漸清晰,那么為什么會有構造函數(shù)呢?構造函數(shù)有什么作用?構造函數(shù)是面向對象編程思想所需求的,它的主要作用有以下兩個:
1) 創(chuàng)建對象。任何一個對象創(chuàng)建時,都需要初始化才能使用,所以任何類想要創(chuàng)建實例對象就必須具有構造函數(shù)。
2) 對象初始化。構造函數(shù)可以對對象進行初始化,并且是給與之格式(參數(shù)列表)相符合的對象初始化,是具有一定針對性的初始化函數(shù)。
4.構造函數(shù)與普通函數(shù)的區(qū)別
下面來詳細的分析下構造函數(shù)與普通函數(shù)的區(qū)別,通過兩者的一個對比,希望可以加深對構造函數(shù)的概念的理解。
1) 格式不同:
構造函數(shù)不存在返回類型,函數(shù)名與所在類的類名一致;
普通函數(shù)有返回類型,函數(shù)名可以根據(jù)需求進行命名。
2)調用時期不同
構造函數(shù)在類的對象創(chuàng)建時就運行;
普通函數(shù)在對象調用時才會執(zhí)行。
3)執(zhí)行次數(shù)不同
一個對象創(chuàng)建后,其構造函數(shù)只執(zhí)行一次,就是創(chuàng)建時執(zhí)行;
一個對象創(chuàng)建后,其普通函數(shù)可以執(zhí)行多次,取決于對象的調用次數(shù)。
換一種說法來理解。
(1).一般函數(shù)是用于定義對象應該具備的功能。而構造函數(shù)定義的是,對象在調用功能之前,在建立時,應該具備的一些內容。也就是對象的初始化內容。
(2).構造函數(shù)是在對象建立時由jvm調用,給對象初始化。一般函數(shù)是對象建立后,當對象調用該功能時才會執(zhí)行。
(3).普通函數(shù)可以使用對象多次調用,構造函數(shù)就在創(chuàng)建對象時調用。
(4).構造函數(shù)的函數(shù)名要與類名一樣,而普通的函數(shù)只要符合標識符的命名規(guī)則即可。
(5).構造函數(shù)沒有返回值類型。
5.構造函數(shù)的使用場景
分析了那么多構造函數(shù)的信息,那么什么時候使用構造函數(shù)呢?既然構造函數(shù)是對新對象進行初始化,那么當開發(fā)中分析事物的時候,發(fā)現(xiàn)事物一出現(xiàn)就具備了某些特征時,就可以將其定義在構造函數(shù)中,這樣方便快捷,也符合面向對象的編程思想。
6.構造函數(shù)在繼承中的特點
在繼承中,子類創(chuàng)建的對象可以調用父類的公共方法和屬性,那么子類會不會調用父類的構造函數(shù)呢?子類的構造函數(shù)與父類的構造函數(shù)有什么關系?子類的構造函數(shù)需要注意些什么問題呢?下面來解答這三個問題。
1) 子類會不會調用父類的函數(shù)?
子類繼承父類,子類對象初始化時父類的構造函數(shù)也會執(zhí)行,因為子類需要使用父類中的屬性,子類需要知道是如何初始化的,所以子類初始化必然會調用父類的構造函數(shù)(除非父類沒有屬性,那么這個類的描述也太差了點,或者沒有必要去創(chuàng)建這個類了)。
2) 子類的構造函數(shù)與父類的構造函數(shù)有什么關系?
子類的構造函數(shù)中默認的第一行有一條隱式語句super(),該語句會訪問父類中的空參數(shù)構造函數(shù),除非父類中沒有空參數(shù)的構造函數(shù),那么子類構造函數(shù)的第一行必須顯式調用父類的構造函數(shù),即super(int x,…) 。
3) 子類的構造函數(shù)需要注意些什么問題呢?
子類的構造函數(shù)中,super()語句代表調用了父類的構造函數(shù);this()語句代表調用了子類自身的構造函數(shù)。需要注意的是,如果這兩條語句顯式寫出來必須放在構造方法的第一行,而且這兩條語句不能共存,一個構造函數(shù)中的第一行要么是this()要么是super()。
為什么在第一行?因為需要首先進行初始化。
為什么不能共存?因為this()代表的本類的其他構造函數(shù),也會去調用super(),出現(xiàn)了this()就沒有必要再出現(xiàn)super()了,重復調用沒有意義。換言之,子類中至少有一個構造函數(shù)的開頭為super(),當然可以隱式存在;也就是說至少有一個構造函數(shù)的開頭不是this()。
7.構造函數(shù)的擴展
以上的六條已經講構造函數(shù)的概念、特點、使用等問題介紹的比較清楚,下面來介紹幾點與構造函數(shù)相關的擴展性的小知識。
1) 所有的類都有構造函數(shù)么?構造函數(shù)可以被私有化么?
既然構造函數(shù)用于創(chuàng)建對象并且初始化對象,那么當一個類不需要創(chuàng)建對象時,就不需要定義構造函數(shù),但是在java中,所有的類都擁有構造函數(shù),只是有些類的構造函數(shù)對開發(fā)人員來說是隱藏不可見的,這一點與我們的預期并不相同,不過換個角度這也很好理解,因為java是面向對象的,我們創(chuàng)建類的目的就是為了創(chuàng)建對象或者創(chuàng)建其子類對象,所以沒有構造函數(shù)的類(無法創(chuàng)建對象的類)并沒有什么意義。
而對于第二個問題,一個類不想要外界創(chuàng)建其對象時,就可以將其構造函數(shù)私有化,本類中提供返回對象的方法,并且多數(shù)情況下提供的對象是唯一的,單例設計模式就是一個很好的例子,而當我們開發(fā)中需要保證對象唯一性的時候,往往就采取這種做法。
2) 構造代碼塊與構造函數(shù)有什么相似和不同?
構造代碼塊用一對“{}”表示,代碼塊位置沒有具體的要求,但必須與類的成員同等級別,在括號的區(qū)域內,可以對所有該類的對象進行初始化,也就是說該類對象創(chuàng)建時都會執(zhí)行到該代碼塊,并且其優(yōu)先于構造函數(shù)執(zhí)行。構造函數(shù)如前面提到的是具有針對性的,而構造代碼塊是作用于所有本類對象的。
構造函數(shù)要注意的細節(jié):
(1).當類中沒有定義構造函數(shù)時,系統(tǒng)會指定給該類加上一個空參數(shù)的構造函數(shù)。這個是類中默認的構造函數(shù)。當類中如果自定義了構造函數(shù),這時默認的構造函數(shù)就沒有了。
備注:可以通過javap命令驗證。
(2).在一個類中可以定義多個構造函數(shù),以進行不同的初始化。多個構造函數(shù)存在于類中,是以重載的形式體現(xiàn)的。因為構造函數(shù)的名稱都相同。
總結
以上就是本文關于Java編程中的構造函數(shù)詳細介紹的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
有什么問題可以隨時留言指出,小編會及時更改,感謝大家。
相關文章
Java?CopyOnWriteArrayList源碼超詳細分析
為了將讀取的性能發(fā)揮到極致,jdk中提供了CopyOnWriteArrayList類,下面這篇文章主要給大家介紹了關于java中CopyOnWriteArrayList源碼解析的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-11-11
java操作mongodb時,對象bean和DBObject相互轉換的方法(推薦)
下面小編就為大家?guī)硪黄猨ava操作mongodb時,對象bean和DBObject相互轉換的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11
springboot使用自定義注解實現(xiàn)aop切面日志
這篇文章主要為大家詳細介紹了springboot使用自定義注解實現(xiàn)aop切面日志,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-09-09
springboot項目使用Disruptor做內部消息隊列的實現(xiàn)
本文主要介紹了springboot項目使用Disruptor做內部消息隊列的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07
mybatis簡介與配置_動力節(jié)點Java學院整理
這篇文章主要介紹了mybatis簡介與配置,介紹了MyBatis+Spring+MySql簡單配置,有興趣的可以了解一下2017-09-09

