程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中對象初始化次序的具體引見

Java中對象初始化次序的具體引見

編輯:關於JAVA

Java中對象初始化次序的具體引見。本站提示廣大學習愛好者:(Java中對象初始化次序的具體引見)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中對象初始化次序的具體引見正文


媒介

在Java中,一個對象在可以被應用之前必需要被准確地初始化,這一點是Java標准劃定的。比來我發明了一個風趣的成績,這個成績的謎底乍一看下騙過了我的眼睛。看一下這三個類:

package com.ds.test;

public class Upper {
 String upperString;

 public Upper() {
 Initializer.initialize(this);
 }
}
package com.ds.test;

public class Lower extends Upper {

 String lowerString = null;

 public Lower() {
 super();
 System.out.println("Upper: " + upperString);
 System.out.println("Lower: " + lowerString);
 }

 public static void main(final String[] args) {
 new Lower();
 }
}
package com.ds.test;
public class Initializer {
 static void initialize(final Upper anUpper) {
 if (anUpper instanceof Lower) {
 Lower lower = (Lower) anUpper;
 lower.lowerString = "lowerInited";
 }
 anUpper.upperString = "upperInited";
 }
}

運轉 Lower 這個類可以獲得甚麼輸入?在這個極簡的例子中可以更輕易地看到全部情勢,然則這個情況產生在實際中會有異常多的代碼疏散一小我的留意力。

不論怎樣樣,輸入是像如許的:

Upper: upperInited
Lower: null;

固然小示例中應用了 String 類型,Initializer 類的現實代碼中有一個用於注冊的拜托對象,與 Lower 類的功效是雷同的 — 至多 Lower 類是這個意圖。但因為某些緣由在運轉運用法式時沒有任務。取而代之的是,應用了默許途徑,拜托對象沒有被設置 (null)。

如今略微轉變一下 Lower 的代碼:

package com.ds.test;

public class Lower extends Upper {

 String lowerString;

 public Lower() {
 super();
 System.out.println("Upper: " + upperString);
 System.out.println("Lower: " + lowerString);
 }

 public static void main(final String[] args) {
 new Lower();
 }
}

如今的輸入是如許的:

Upper: upperInited
Lower: lowerInited

發明代碼中的差別了嗎?

是的,這個 lowerString 字段不再明白地設置為空。為何這麼做會有分歧。不論如何參考類型字段(例如這裡的 String )的默許值不是為空的嗎?固然是空的。現實證實,固然這類渺小的變更明顯不會以任何方法轉變代碼行動,然則卻讓成果變的分歧。

那末,究竟產生了甚麼?當檢查初始化次序的時刻一切就變的清楚了:

1.main() 函數挪用了 Lower 結構器。

2.Lower 的一個實例被預備好了。意味著一切的字段都被創立而且填充了默許值,例如,援用類型的默許值為空,布爾類型的默許值為 false 。在這個時刻,任何的對字段的內聯賦值都沒有產生。

3.父類結構器被挪用了。這是被說話的特征所強迫履行的。所以在其他任何事產生之前,Upper 的結構器被挪用了。

4.Upper 這個結構器運轉而且指定了一個援用,指向 Initializer.initialize() 辦法新創立的的實例。

5.Initializer 類為兩個字段( upperString lowerString )附上新字符串。經由過程應用有點邋遢的 instanceof 實例檢討做到為那兩個字段賦值 – 這不是一個特殊好的 設計形式 ,然則也有可行的,不消管那末多。一旦產生了,upperString lowerString 的援用都不再為空。

6.Initializer.initialize() 的挪用完成,Upper 結構器也異樣完成。

7.如今變得風趣了:Lower 實例的結構在持續。假定在 lowerString 字段的聲明中沒有明白地 =null 賦值,Lower 結構器恢復履行而且打印出兩個銜接到字段的字符串。

但是,假如有一個明白地賦值 null 的操作,履行流程會略有分歧:當父類結構器完成後,在其他的結構器運轉前,任何變量初始化都邑履行(拜見java說話標准12.5節)。在這類情形下,之前賦值給 lowerString 的字符串援用不會再一次被付與 null 。然後持續履行其他的函數結構,如今打印 lowerString 的值為: null 。

這是一個很好的例子,不只便利我們若何留意一些創立對象的細節(或許曉得去哪裡檢查 Java 編碼標准,打印的或許在線的),還顯示了為何像如許寫初始化是很蹩腳的。我們一點都不該該關懷 Upper 的子類。相反的,假如由於一些緣由對某些字段的初始化不克不及在子類自己被完成,它將只須要它本身的某些初始化贊助類的變體。在這類情形下,假如你應用 String lowString 或許 String lowerString = null 是真的沒有任何差別的,它應當是甚麼就會是甚麼。

總結

以上就是這篇文章的全體內容了,願望這篇文章的內容對年夜家的進修或許任務能帶來必定的贊助,假如有成績年夜家可以留言交換。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved