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

溫馨提示×

溫馨提示×

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

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

Java是通過什么機制來確保對象初始化呢?

發布時間:2020-06-05 10:11:40 來源:網絡 閱讀:122 作者:沉默王二 欄目:編程語言

在 Java 中,無論是對象,還是基本類型,都不允許在未經初始化的情況下使用它們;否則,Java 編譯器就會熱情地提醒你——請初始化后再使用。

那,Java 是通過什么機制來確保對象初始化呢?

答案就是“構造器”——類的對象要被正確的初始化,就必須先過構造器這一關。

程序清單1-1:一個帶有構造器的簡單類

class?Writer?{
????public?Writer()?{
????????System.out.println("我是一名寫作愛好者");
????}

????public?static?void?main(String[]?args)?{
????????new?Writer();
????}
}

當使用關鍵字 new 來創建一個對象 Writer 時,就會調用構造器(與類名 Writer 相同的方法 Writer())進行初始化,因此上述程序就會輸出“我是一名寫作愛好者”。

構造方法 Writer() 沒有參數,因此被稱為無參構造器;事實上,無參構造器是可以省略的——編譯器會自動創建一個無參構造器,被稱為“默認構造器”(Java 設計者真的無比明智啊——幫助程序員省去了創建默認構造器的麻煩)。

程序清單1-2:默認構造器

class?Writer?{
????public?static?void?main(String[]?args)?{
????????new?Writer();
????}
}

默認構造器并不會一直“默認”存在,如果已經定義了一個構造器,無論有參還是無參,編譯器將不再自動創建默認構造器。

程序清單1-3:不會一直存在的默認構造器

class?Writer?{
????public?Writer(String?name)?{
????????System.out.println(name?+?"是一名寫作愛好者");
????}

????public?static?void?main(String[]?args)?{
????????new?Writer();
????????new?Writer("沉默王二");
????}
}

一旦定義了一個有參構造器,那么在創建對象的時候就必須傳遞構造器需要的參數,否則編譯器會提示“The constructor Writer() is undefined”(使用 new Writer() 創建對象對)——這樣做的好處就是,確保對象在初始化的時候符合類設計的初衷(上例中,Writer 需要指定作者姓名,所以你在創建 Writer 對象時不能不傳遞作者姓名)。

讀王小波的《沉默的大多數》,我喜歡上了一句話:“參差不齊乃幸福本源”。王小波的意思可能是想說:一個能容忍不同觀點與不同的生活方式的社會,才是一個幸福的社會。那么,在 Java 的世界里,也有一個幸福的社會。

由于構造器的特殊性(不能與其他成員方法的名字沖突),導致構造器的名字必須和類名保持一致,也就是說,一個類,只能有一個構造器名。這似乎局限了構造器的使用方式。但其實不然,Java 允許方法重載——可以只有一個方法名,但方法的參數列表可不盡相同;哎,問題就這么巧妙的解決了。

程序清單2-1:構造方法的重載

class?Writer?{
????private?String?name;
????private?String?bookName;

????public?Writer(String?name)?{
????????this.name?=?name;
????????System.out.println(name?+?"是一名寫作愛好者");
????}

????public?Writer(String?name,?String?bookName)?{
????????this.name?=?name;
????????this.bookName?=?bookName;

????????System.out.println(name?+?"不僅是一名寫作愛好者,還出版了書籍"?+?bookName);
????}

????public?static?void?main(String[]?args)?{
????????new?Writer("沉默王二");
????????new?Writer("沉默王三",?"《Web全棧開發進階之路》");
????}
}

你看,沉默王二沒出版書籍,可以是一名寫作愛好者;沉默王三雖然出版了書籍《Web全棧開發進階之路》,但仍然和王二是好兄弟,并沒有看不起王二(從來沒說過:“王二,你個渣渣,連本書都沒有出版,好意思說自己是寫作愛好者?”)。是不是很和諧?

Java 該如何區分重載方法(畢竟參數名相同)呢?上例中,你也看到了,參數個數的不同就可以區分;另外,參數的類型和順序(不建議使用,因為這樣做會讓代碼難以維護,見下例)也可以用來作為區分的條件。

程序清單2-2:難以維護的方法重載(靠順序,別這樣!)

class?Writer?{
????private?String?name;
????private?int?age;

????public?Writer(String?name,?int?age)?{
????????this.name?=?name;
????????this.age?=?age;
????}

????public?Writer(int?age,?String?name)?{
????????this.age?=?age;
????????this.name?=?name;
????}
}

上一篇:Java 流程控制語句

下一篇:Java 訪問權限控制:public、private、protected

微信搜索「沉默王二」公眾號,關注后回復「免費視頻」獲取 500G Java 高質量教學視頻(已分門別類)。


向AI問一下細節

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

AI

陈巴尔虎旗| 汽车| 汕头市| 湖北省| 洛浦县| 嘉荫县| 石棉县| 治多县| 红桥区| 日土县| 遵义市| 沁源县| 托克托县| 台东市| 潼关县| 黄山市| 大城县| 孝昌县| 山西省| 孝感市| 西青区| 宁阳县| 卢龙县| 鄂伦春自治旗| 宜兴市| 曲阜市| 盘锦市| 法库县| 二连浩特市| 田林县| 中牟县| 兰西县| 葫芦岛市| 庄河市| 宜兰市| 固原市| 昆明市| 平顶山市| 余江县| 精河县| 平南县|