中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

私有構造器怎么在Java中使用

發布時間:2020-12-04 17:23:49 來源:億速云 閱讀:128 作者:Leah 欄目:編程語言

私有構造器怎么在Java中使用?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

構造器作為Java類的一個特殊的成員同樣可以設置關鍵字來控制其訪問權限。在大多數情況下,我們一般把構造器設置為公有成員,即public的,在默認情況下,如果不寫任何關鍵字,其訪問權限也是public。這樣,在我們新建一個類的對象的時候,構造器會創建對象后被自動調用,發生在其他類成員被設置為默認初始值之后,當然如果有字段初始器和初始化塊的話,構造器的調用會發生在此之后。構造器的主要作用是在new將對象的引用返回之前初始化對象。

言歸正傳,什么叫私有構造器。所謂私有構造器,就是用private關鍵字聲明的構造器,即使用private關鍵字聲明的構造函數。。與一般公有構造器最大的區別在于,其訪問權限是private,于是它只能被包含它的類自身所訪問,而無法在類的外部調用,故而可以阻止對象的生成。所以,如果一個類只有一個私有構造器,而沒有任何公有構造器,是無法生成任何對象的。

由于類的構造函數時私有的,所以此類不能被實例化,同時也不能被繼承。《Effective Java》第三條:用私有構造器或者枚舉強化Singleton屬性。所謂Singleton屬性是指僅僅被實例化一次的類。第四條:通過私有構造器強化不可實例化的能力。在Java中實現Singleton有兩種方式:

public class Elvis {
 public static final Elvis INSTANCE = new Elvis();
 private Elvis() {}
}
public class Elvis {
 private static final Elvis INSTANCE = new Elvis();
 private Elvis() {}
 public static Elvis getInstance() { return INSTANCE;}
}

方法一:私有構造函數只能被調用一次,用來實例化公有的靜態final域Elvis.INSTANCE,一旦Elvis被實例化,只會存在一個Elvis實例(享有特權的客戶端可以借助AccessibleObject.setAccessible方法通過反射機制調用私有構造器);

方法二:使用靜態方法getInstance返回對同一個對象的引用,永遠不會創建其他Evlis實例。

為什么需要私有構造器,如果類不能被實例化該怎么使用這個類的方法?

私有構造器的存在可以讓某些類不能被實例化和子類化,這些類通常是一些工具類,例如java.lang.Math等,訪問這些類的方法我們可以定義公有的靜態方法來實現,如A.methon()

public class A {
 private A() {}
 public static void methon() {}    
}

java.lang.Math中私有構造器的使用,可以看到Math類被定義為final的,使用了private的構造函數,它的方法都是static的,所以調用其方法只需要Math.sin(x)即可:

public final class Math {
 private Math() {}
 public static final double E = 2.7182818284590452354;
 public static final double PI = 3.14159265358979323846;
 public static double sin(double a) {
  return StrictMath.sin(a); // default impl. delegates to StrictMath
 } 
 public static double cos(double a) {
  return StrictMath.cos(a); // default impl. delegates to StrictMath
 }
 public static double tan(double a) {
  return StrictMath.tan(a); // default impl. delegates to StrictMath
 }
 ......
 public static float scalb(float f, int scaleFactor) {
  return sun.misc.FpUtils.scalb(f, scaleFactor);
 }
}

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

逊克县| 宁晋县| 桐庐县| 修武县| 拜泉县| 称多县| 定边县| 高雄市| 疏勒县| 洪雅县| 庆云县| 博野县| 诸暨市| 和静县| 淳安县| 天全县| 黔西| 昆山市| 自贡市| 姜堰市| 犍为县| 措美县| 九台市| 开江县| 禄丰县| 台北县| 太康县| 玛沁县| 和田市| 凤凰县| 渝北区| 万源市| 达拉特旗| 吴川市| 滨州市| 康定县| 佛山市| 新河县| 钦州市| 凉山| 广德县|