要想學好Java編程,構造器、方法重載、this關鍵字、垃圾回收機制,這4關一定要過!

来源:https://www.cnblogs.com/qing-gee/archive/2018/11/23/10005401.html
-Advertisement-
Play Games

有人說,你應該關註時事、財經,甚至流行的電影、電視劇,才有可能趁著熱點寫出爆文;有人說,你別再寫“無聊”的技術文了,因為程式員的圈子真的很小,即便是像鴻祥那樣的招牌大牛,文章是那麼的乾貨,瀏覽量有多少?不到萬吧;有人說,你別妄想在寫作上面知識變現了,因為你寫的文章真的很不優秀,我都不愛看! 我想說, ...


有人說,你應該關註時事、財經,甚至流行的電影、電視劇,才有可能趁著熱點寫出爆文;有人說,你別再寫“無聊”的技術文了,因為程式員的圈子真的很小,即便是像鴻洋那樣的招牌大牛,文章是那麼的乾貨,瀏覽量有多少?不到萬吧;有人說,你別妄想在寫作上面知識變現了,因為你寫的文章真的很不優秀,我都不愛看!

我想說,你們說的話我都不愛聽!我也懶得反駁,因為我沒有成功,也就沒有話語權,多說無益。我只想做一名執拗的程式員,靜靜地寫文,哪怕只有一個讀者——有時候,做一件事,並不是想要結果,僅僅只是因為心底那種狂熱的喜歡。

今天,我打算聊聊Java編程中的初始化。

01、使用構造器來確保對象初始化

在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對象時不能不傳遞作者姓名)。

02、參差不齊乃幸福本源

讀王小波的《沉默的大多數》,我喜歡上了一句話:“參差不齊乃幸福本源”。王小波的意思可能是想說:一個能容忍不同觀點與不同的生活方式的社會,才是一個幸福的社會。那麼,在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;
    }
}

03、返回當前對象引用的this關鍵字

在很長一段時間里,我對this關鍵字都避而不見,因為我搞不懂它到底在幹嘛,我所使用它的場合僅限於程式清單2-1(this.name指的是類的成員變數,而name指的是當前方法的參數)。直到我遇見了jQuery(一個快速、簡潔的JavaScript框架)的鏈式調用。

程式清單3-1:jQuery的鏈式調用

$("#canvas").append("我是一塊抹布")
            .show();

方法後面還能再緊跟一個方法,就好像一個胯下運球再接一個後仰跳投,超自然超連貫超燃的一連串動作,令人心情感到愉悅。這背後是什麼原理呢?

程式清單3-2:jQuery的鏈式調用的背後

 var MyJQ = function(){
 }
 MyJQ.prototype = {
      append : function(content){
         console.log("添加內容");
         return this;
      },
     show : function(){
         console.log("將元素顯示");
         return this;
      }
 };
 var myjq = new MyJQ();
 myjq.append("我是一塊抹布").show();

看完程式清單3-2之後,你就會恍然大悟,原來方法的內部返回了一個this,而這個this就是當前對象的引用;也就是說,myjq.append("我是一塊抹布").show();就相當於:myjq.append("我是一塊抹布");myjq.show();

理解了jQuery的鏈式調用,我們來模擬一下Java當中的鏈式調用(寫作者做完運動後去睡覺)。

程式清單3-3:Java的鏈式調用

class Writer {
    public Writer sleep() {
        System.out.println("睡一覺");
        return this;
    }

    public Writer ml() {
        System.out.println("做運動");
        return this;
    }

    public static void main(String[] args) {
        new Writer().ml().sleep();
    }
}

04、理想國中的Java垃圾回收

對象要想被正確使用,必須先被初始化,這是一切的開端;那麼,當對象不再被使用後,它就需要被清理掉,要善始善終。假如你遇到一個面試官,他要“強行”問你關於Java垃圾回收的一些問題,你可以提前做好下麵這些準備。

Q:為什麼要進行垃圾回收?
A:如果不進行垃圾回收,記憶體遲早都會被消耗空。除非記憶體無限大,我們可以任性的分配而不回收,但是事實並非如此。所以,垃圾回收是必須的。

Q:哪些記憶體需要回收?
A:所謂“要回收的垃圾”無非就是那些不可能再被任何途徑使用的對象。

Q:Java是如何回收垃圾的?
A:深入理解 Java 垃圾回收機制

不過,在我的印象里,有一副爆笑的動態圖令我印象深刻,它隱喻的是Java的垃圾回收機制。

【寫在最後】

喜歡就推薦分享,因為你的參與讓我在寫作的道路上不再感到孤單。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DOM的全稱是Document Object Model 文檔對象模型,DOM定義了表示和修改文檔所需的對象、這些對象的行為和屬性以及這些對象之間的關係。 DOM對象即為宿主對象,由瀏覽器廠商定義,用來操作html的css功能的一類對象和集合。不過瀏覽器廠商之間大部分都遵循w3c標準。 簡單來說,D... ...
  • 創建型設計模式是設計模式的入門基礎,主要包括工廠方法模式、抽象工廠模式、建造者模式、原型模式、單例模式,以及簡單工廠模式,本文對他們進行了分析對比,總結了創建型模式之間的區別聯繫 ...
  • 一、概念 工廠方法模式:用來封裝對象的創建。工廠方法模式(Factory Method Pattern)通過讓 子類 決定該創建的對象是什麼,來達到將對象創建的過程封裝的目的。這樣,關於超類的代碼和子類創建對象的代碼之間就解耦了。 抽象工廠模式(Abstract Factory Pattern):提 ...
  • 直接使用 JDBC 的場景,如果代碼中存在拼接 SQL 語句,那麼很有可能會產生註入,如 安全的寫法是使用 參數化查詢 ( parameterized queries ),即 SQL 語句中使用參數綁定( ? 占位符 ) 和 PreparedStatement,如 使用PreparedStateme ...
  • 1.Map 遍歷: 2.map的長度: int size=Map.size(); ...
  • 前言 網際網路聯繫的是世界各地的電腦(通過電纜),萬維網聯繫的是網上的各種各樣資源(通過文本超鏈接),如靜態的HTML文件,動態的軟體程式······。由於萬維網的存在,處於網際網路中的每台電腦可以很方便地進行消息交流、文件資源交流······。基於網際網路的幫助,我們可以在web客戶端(如瀏覽器等) ...
  • FileManager 圖片管理插件是 TinyMCE下 免費且非官方的文件插件,可上傳/管理的類型包括:文件,圖片,視頻。 本教程主要展示大叔在為安裝開發插件過程中進行調整的修改記錄。 ...
  • 昨天是感恩節,上幼兒園的女兒在老師的叮囑下,晚上為我和老婆洗了腳(形式上的^_^),還給我們每人端了一杯水。看著孩子一天天的長大,懂事,感覺很開心。話說咱們程式員這麼辛苦是為了什麼?不就是為了老婆,孩子,熱炕頭,有一個溫暖幸福的家庭,再捎帶著用代碼改變一下世界嗎?想到這裡,頓時覺得學習,創作博客的勁... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...