色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

有關(guān)于Java構(gòu)造器

瀏覽:2日期:2024-06-14 18:38:12
內(nèi)容: 關(guān)于Java構(gòu)造器作者:langm版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明作者:langm原文地址:http://www.matrix.org.cn/resource/article/44/44041.html關(guān)鍵詞: Java 構(gòu)造器 首先要注意的是Java的構(gòu)造器并不是函數(shù),所以他并不能被繼承,這在我們extends的時(shí)候?qū)懽宇惖臉?gòu)造器時(shí)比較的常見(jiàn),即使子類構(gòu)造器參數(shù)和父類的完全一樣,我們也要寫super就是因?yàn)檫@個(gè)原因。 構(gòu)造器的修飾符比較的有限,僅僅只有public private protected這三個(gè),其他的例如任何修飾符都不能對(duì)其使用,也就是說(shuō)構(gòu)造器不允許被成名成抽象、同步、靜態(tài)等等訪問(wèn)限制以外的形式。 因?yàn)闃?gòu)造器不是函數(shù),所以它是沒(méi)有返回值的,也不允許有返回值。但是這里要說(shuō)明一下,構(gòu)造器中允許存在return語(yǔ)句,但是return什么都不返回,如果你指定了返回值,雖然編譯器不會(huì)報(bào)出任何錯(cuò)誤,但是JVM會(huì)認(rèn)為他是一個(gè)與構(gòu)造器同名的函數(shù)罷了,這樣就會(huì)出現(xiàn)一些莫名其妙的無(wú)法找到構(gòu)造器的錯(cuò)誤,這里是要加倍注意的。 在我們extends一個(gè)子類的時(shí)候經(jīng)常會(huì)出現(xiàn)一些意想不到的問(wèn)題,我在這里說(shuō)一些和構(gòu)造器有關(guān)的。 首先說(shuō)一下Java在構(gòu)造實(shí)例時(shí)的順序(不討論裝載類的過(guò)程) 構(gòu)造的粗略過(guò)程如下 1、分配對(duì)象空間,并將對(duì)象中成員初始化為0或者空,java不允許用戶操縱一個(gè)不定值的對(duì)象。2、執(zhí)行屬性值的顯式初始化(這里有一點(diǎn)變化,一會(huì)解釋,但大體是這樣的)3、執(zhí)行構(gòu)造器4、將變量關(guān)聯(lián)到堆中的對(duì)象上 介紹一下準(zhǔn)備知識(shí),以備一會(huì)來(lái)詳細(xì)說(shuō)明這個(gè)的流程 this() super()是你如果想用傳入當(dāng)前構(gòu)造器中的參數(shù)或者構(gòu)造器中的數(shù)據(jù)調(diào)用其他構(gòu)造器或者控制父類構(gòu)造器時(shí)使用的,在一個(gè)構(gòu)造器中你只能使用this()或者super()之中的一個(gè),而且調(diào)用的位置只能在構(gòu)造器的第一行, 在子類中如果你希望調(diào)用父類的構(gòu)造器來(lái)初始化父類的部分,那就用合適的參數(shù)來(lái)調(diào)用super(),如果你用沒(méi)有參數(shù)的super()來(lái)調(diào)用父類的構(gòu)造器(同時(shí)也沒(méi)有使用this()來(lái)調(diào)用其他構(gòu)造器),父類缺省的構(gòu)造器會(huì)被調(diào)用,如果父類沒(méi)有缺省的構(gòu)造器,那編譯器就會(huì)報(bào)一個(gè)錯(cuò)誤,注意此處,我們經(jīng)常在繼承父類的時(shí)候構(gòu)造器中并不寫和父類有關(guān)的內(nèi)容,此時(shí)如果父類沒(méi)有缺省構(gòu)造器,就會(huì)出現(xiàn)編譯器添加的缺省構(gòu)造器給你添麻煩的問(wèn)題了哦。例如:Class b extends a{public b(){}}就沒(méi)有任何有關(guān)父類構(gòu)造器的信息,這時(shí)父類的缺省構(gòu)造器就會(huì)被調(diào)用。 舉個(gè)SL-275中的例子1 public class Manager extends Employee {2 private String department;34 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) { // 這里就沒(méi)有super(),編譯器會(huì)自動(dòng)地添加一個(gè)空參數(shù)的缺省super構(gòu)造器,此時(shí)如果Employee類中沒(méi)有空參數(shù)的缺省構(gòu)造器,那就會(huì)導(dǎo)致一個(gè)編譯錯(cuò)誤13 department = d;14 }15 } 你必須在構(gòu)造器的第一行放置super或者this構(gòu)造器,否則編譯器會(huì)自動(dòng)地放一個(gè)空參數(shù)的super構(gòu)造器的,其他的構(gòu)造器也可以調(diào)用super或者this,調(diào)用成一個(gè)遞歸構(gòu)造鏈,最后的結(jié)果是父類的構(gòu)造器(可能有多級(jí)父類構(gòu)造器)始終在子類的構(gòu)造器之前執(zhí)行,遞歸的調(diào)用父類構(gòu)造器 在具體構(gòu)造類實(shí)例的過(guò)程中,上邊過(guò)程的第二步和第三步是有一些變化的,這里的順序是這樣的,分配了對(duì)象空間及對(duì)象成員初始化為默認(rèn)值之后,構(gòu)造器就遞歸的從繼承樹(shù)由根部向下調(diào)用,每個(gè)構(gòu)造器的執(zhí)行過(guò)程是這樣的:1、Bind構(gòu)造器的參數(shù)2、如果顯式的調(diào)用了this,那就遞歸調(diào)用this構(gòu)造器然后跳到步驟53、遞歸調(diào)用顯式或者隱式的父類構(gòu)造器,除了Object以外,因?yàn)樗鼪](méi)有父類4、執(zhí)行顯式的實(shí)例變量初始化(也就是上邊的流程中的第二步,調(diào)用返回以后執(zhí)行,這個(gè)步驟相當(dāng)于在父構(gòu)造器執(zhí)行后隱含執(zhí)行的,看樣子像一個(gè)特殊處理) 5、執(zhí)行構(gòu)造器的其它部分這里的步驟很重要哦!!!!! 從這個(gè)步驟中可以很明顯的發(fā)現(xiàn)這個(gè)實(shí)例初始化時(shí)的遞歸調(diào)用過(guò)程,估計(jì)看過(guò)這個(gè)你應(yīng)該能夠理解這個(gè)遞歸構(gòu)造鏈?zhǔn)窃趺礃踊厥铝恕? 這里還是給出SL-275中的一個(gè)例子,讓你充分理解一下這個(gè)遞歸的過(guò)程。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;}}在創(chuàng)建Manager('Joe Smith','Sales'):時(shí),步驟如下0 basic initialization0.1 allocate memory for the complete Manager object0.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() call1.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=null1.3.2.2 no explicit this() call1.3.2.3 call super() for Object()1.3.2.3.1 no binding necessary1.3.2.3.2 no this() call1.3.2.3.3 no super() call (Object is the root)1.3.2.3.4 no explicit variable initialization for Object1.3.2.3.5 no method body to call1.3.2.4 initialize explicit Employee variables: salary=15000.00;注意:在父構(gòu)造器返回后子類才會(huì)初始化實(shí)例變量的值。1.3.2.5 execute body: name='Joe Smith'; date=null;1.3.3 - 1.3.4 steps skipped1.3.5 execute body: no body in Employee(String)1.4 no explicit initializers for Manager1.5 execute body: department='Sales' 這個(gè)流程就說(shuō)明了一切,這個(gè)步驟是要注意的。一會(huì)還有些內(nèi)容是要涉及到這里的。 寫在后邊的一些在使用構(gòu)造器中的注意事項(xiàng)。 一、構(gòu)造器中一定不要?jiǎng)?chuàng)建自身的實(shí)例,否則會(huì)造成調(diào)用棧溢出錯(cuò)誤。這個(gè)規(guī)則也適用于對(duì)象的實(shí)例變量,如果對(duì)象中有自身的引用,這個(gè)引用一定不能在定義中或者構(gòu)造器中初始化。class a{ a _a = new a(); public a(){ _a = new a(); a _b = new a();}}以上三種情況都會(huì)造成棧溢出,呵呵,這樣會(huì)造成一個(gè)無(wú)窮遞歸的調(diào)用棧。二、如果父類是一個(gè)抽象類,那通過(guò)調(diào)用父類的構(gòu)造器,也可以將它初始化,并且初始化其中的數(shù)據(jù)。三、如果你要在構(gòu)造器中調(diào)用一個(gè)方法時(shí),將該方法聲明為private。對(duì)于這個(gè)規(guī)則是需要一些說(shuō)明的,假使你的父類構(gòu)造器中要調(diào)用一個(gè)非靜態(tài)方法,而這個(gè)方法不是private的又被子類所重載,這樣在實(shí)際創(chuàng)建子類的過(guò)程中遞歸調(diào)用到了父類的構(gòu)造器時(shí),父類構(gòu)造器對(duì)這個(gè)方法的調(diào)用就會(huì)由于多態(tài)而實(shí)際上調(diào)用了子類的方法,當(dāng)這個(gè)子類方法需要用到子類中實(shí)例變量的時(shí)候,就會(huì)由于變量沒(méi)有初始化而出現(xiàn)異常(至于為什么子類中的實(shí)例變量沒(méi)有初始化可以參考上邊的實(shí)例初始化過(guò)程),這是Java不想看到的情況。而當(dāng)父類構(gòu)造器中調(diào)用的方法是一個(gè)private方法時(shí),多態(tài)就不會(huì)出現(xiàn),也就不會(huì)出現(xiàn)父類構(gòu)造器調(diào)用子類方法的情況,這樣可以保證父類始終調(diào)用自己的方法,即使這個(gè)方法中調(diào)用了父類中的實(shí)例變量也不會(huì)出現(xiàn)變量未初始化的情況(變量初始化總是在當(dāng)前類構(gòu)造器主體執(zhí)行之前進(jìn)行)。 這就是我個(gè)人對(duì)構(gòu)造器和實(shí)例初始化(不包括類載入部分)的一點(diǎn)歸納,歡迎大家指正和補(bǔ)充。 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd 關(guān)于Java構(gòu)造器作者:langm版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本
標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 亚洲美女综合网 | 国产一区二区免费在线 | 大陆孕妇孕交视频自拍 | 欧美日韩精品一区二区三区视频 | 99视频免费 | 免费网站看v片在线香蕉 | 国产日本欧美在线观看 | 日本精品一区二区三区在线 | 久久欧美久久欧美精品 | 国产精品久久一区二区三区 | 久久久免费的精品 | 亚洲国产精品看片在线观看 | 在线免费看a | 欧美成人免费tv在线播放 | 美女又黄又免费 | av在线手机播放 | 国内自拍网站 | 国产vs久久 | 精品欧美成人bd高清在线观看 | 热re91久久精品国产91热 | 亚州毛片| 国产一级高清视频 | 欧美一级www片免费观看 | 国产精品爽爽va在线观看无码 | 性刺激久久久久久久久 | 欧美曰批人成在线观看 | 免费公开视频人人人人人人人 | 在线看a级片| 日本免费一区二区三区看片 | 欧美特黄特色aaa大片免费看 | 久久黄色网址 | 日韩欧美不卡一区二区三区 | 大陆老太xxxxxxxxhd | 国内精品福利在线视频 | 日本免费成人网 | 久久国产三级 | 午夜三级国产精品理论三级 | 精品在线视频免费观看 | 国产欧美日韩精品一区二区三区 | 欧美日韩在线永久免费播放 | 成年人午夜影院 |