亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

有關于Java構造器

瀏覽:43日期:2024-06-14 18:38:12
內容: 關于Java構造器作者:langm版權聲明:任何獲得Matrix授權的網站,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明作者:langm原文地址:http://www.matrix.org.cn/resource/article/44/44041.html關鍵詞: Java 構造器 首先要注意的是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;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) { // 這里就沒有super(),編譯器會自動地添加一個空參數的缺省super構造器,此時如果Employee類中沒有空參數的缺省構造器,那就會導致一個編譯錯誤13 department = d;14 }15 } 你必須在構造器的第一行放置super或者this構造器,否則編譯器會自動地放一個空參數的super構造器的,其他的構造器也可以調用super或者this,調用成一個遞歸構造鏈,最后的結果是父類的構造器(可能有多級父類構造器)始終在子類的構造器之前執行,遞歸的調用父類構造器 在具體構造類實例的過程中,上邊過程的第二步和第三步是有一些變化的,這里的順序是這樣的,分配了對象空間及對象成員初始化為默認值之后,構造器就遞歸的從繼承樹由根部向下調用,每個構造器的執行過程是這樣的:1、Bind構造器的參數2、如果顯式的調用了this,那就遞歸調用this構造器然后跳到步驟53、遞歸調用顯式或者隱式的父類構造器,除了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 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;注意:在父構造器返回后子類才會初始化實例變量的值。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' 這個流程就說明了一切,這個步驟是要注意的。一會還有些內容是要涉及到這里的。 寫在后邊的一些在使用構造器中的注意事項。 一、構造器中一定不要創建自身的實例,否則會造成調用棧溢出錯誤。這個規則也適用于對象的實例變量,如果對象中有自身的引用,這個引用一定不能在定義中或者構造器中初始化。class a{ a _a = new a(); public a(){ _a = new a(); a _b = new a();}}以上三種情況都會造成棧溢出,呵呵,這樣會造成一個無窮遞歸的調用棧。二、如果父類是一個抽象類,那通過調用父類的構造器,也可以將它初始化,并且初始化其中的數據。三、如果你要在構造器中調用一個方法時,將該方法聲明為private。對于這個規則是需要一些說明的,假使你的父類構造器中要調用一個非靜態方法,而這個方法不是private的又被子類所重載,這樣在實際創建子類的過程中遞歸調用到了父類的構造器時,父類構造器對這個方法的調用就會由于多態而實際上調用了子類的方法,當這個子類方法需要用到子類中實例變量的時候,就會由于變量沒有初始化而出現異常(至于為什么子類中的實例變量沒有初始化可以參考上邊的實例初始化過程),這是Java不想看到的情況。而當父類構造器中調用的方法是一個private方法時,多態就不會出現,也就不會出現父類構造器調用子類方法的情況,這樣可以保證父類始終調用自己的方法,即使這個方法中調用了父類中的實例變量也不會出現變量未初始化的情況(變量初始化總是在當前類構造器主體執行之前進行)。 這就是我個人對構造器和實例初始化(不包括類載入部分)的一點歸納,歡迎大家指正和補充。 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 關于Java構造器作者:langm版權聲明:任何獲得Matrix授權的網站,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本
標簽: Java
相關文章:
主站蜘蛛池模板: 中国美女bbbbbxxxxx | 日韩一区二区国色天香 | 黄色免费网站在线播放 | 精品欧美一区二区在线观看欧美熟 | 一级做a爰片性色毛片黄书 一级做a爰片性色毛片新版的 | 日韩av成人 | 亚洲日日做天天做日日谢 | 特级黄色毛片 | 自拍视频在线观看视频精品 | 在线免费观看小视频 | 一区二区三区四区在线视频 | 污视频免费在线播放 | 1000部啪啪未满十八勿入中国 | 六月丁香婷婷综合 | 成人最新午夜免费视频 | 久久人人精品 | 国产美女久久久久久久久久久 | 成人做爰www | 免费高清性色生活片 | 免费观看黄色网 | 爱福利视频一区二区 | 女猛烈无遮挡性视频免费 | 麻豆网站在线播放 | 久久er热在这里只有精品66 | 中文字幕日产乱码偷在线 | 99国产精品高清一区二区二区 | 美国黄色小视频 | 91久久夜色精品国产网站 | 片在线观看 | 高清一区高清二区视频 | 国产精品免费一区二区三区 | 99久久精品毛片免费播放 | 国产一区二区日韩欧美在线 | 中文国产成人精品久久96 | 国产美女在线免费观看 | 亚洲一区二区三区不卡视频 | 国产亚洲欧美另类第一页 | 日韩中文在线观看 | 香蕉视频国产精品 | 亚洲精品欧美在线 | 国产高清好大好夹受不了了 |