日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

叮!您收到一份超值Java基础入门资料!

發布時間:2024/7/23 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 叮!您收到一份超值Java基础入门资料! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java語言有什么特點?如何最大效率的學習?深淺拷貝到底有何區別?阿里巴巴高級開發工程師為大家帶來Java系統解讀,帶你掌握Java技術要領,突破重點難點,入門面向對象編程,以詳細示例帶領大家Java基礎入門!

在學習JAVA編程的同學們,可以加我們的學習交流

QQ群:370161306群內有相關學習資料

邢凱航(花名:弗止),阿里巴巴Java高級開發工程師,香港大學計算機科學碩士,16年加入阿里巴巴,目前就職于研發效能事業部用戶聲音及代碼智能化團隊,負責代碼中心后端開發。

以下內容根據演講嘉賓視頻分享以及PPT整理而成。

本文將圍繞一下幾個方面進行介紹:

1.Java語言特點

2.如何學習Java

3.JVM概述

4.面向對象入門

5.示例演示

6.擴展閱讀

一. Java語言特點

1.Java是一種面向對象的語言,以對象為顆粒度,對象中包含屬性和方法,通過對象間的繼承和組合構建程序世界。在學習面向對象語言時,大家不僅僅應該關注過程,還需要對待解決的問題進行抽象和建模,最終生成易于維護和擴展的設計方案。這是一個由淺入深、循序漸進的過程。

  • 其次,Java具有良好的跨平臺特性。Java程序可以不受計算機硬件和操作系統的約束,在任何支持Java虛擬機(JVM)的環境下都可以正常運行。編寫的Java程序經過編譯后生成的字節碼可以被JVM識別,JVM為程序運行屏蔽了底層操作系統的差異。

  • 第三個特點是Java具有垃圾回收機制,簡稱GC(Garbage Collection)。在Java中不需要關心內存空間的回收問題,這一切都會交給JVM進行處理。JVM會識別出哪些對象不需要再次被使用,進而自動回收其內存空間,不需要手動回收,大大提高了開發效率。

  • 第四個特性是Java為單根結構。Java中所有的類都繼承成自同一個基礎類object,如此所有類具有同一個通用接口,并且在層次結構上都屬于同一類型,這為編程提供了極大的便利。

  • 另外Java在設計之初就非常注重安全性,在多個階段均提供了安全保證。Java中不支持指針,避免了非法內存的操作。在編譯運行時,提供了多重語法、類型、邊界和字節碼的檢查。

  • 最后Java語言是解釋型的語言。Java編譯的結果并不會在操作系統上運行,而是生成一個中間class文件,被JVM加載并解釋執行。早期的Java版本因為解釋過程,運行速度相比C++要慢很多,但隨著Java編譯器的優化,某些結果甚至已經表明Java會比C++運行更快,因此如今并沒有統一的定論。

  • 二. 如何學習Java

    首先,Java的學習有兩條主線——Java語言和JVM。一方面,大家需要學習Java語言編程的語法規則,能夠熟練使用JDK提供的常用的工具類,并通過多線程解決問題。此外還需要熟練掌握一至兩個框架,快速上手工程的開發。另一方面,大家需要了解JVM底層,了解Java內部的運行機制。

    其次,關于工具的選擇,這里推薦大家使用在業界比較流行的IntelliJ IDEA或Eclipse。一個好的編程工具會提供很多優秀的能力,提升開發效率。

    第三點,建議大家使用較新的JDK版本,例如JDK8及以上。JDK在更新過程中會出現一些優秀的類庫以及新的語法規則,及時更新版本有助于跟上業界新步伐。最后尤為重要的是需要多看、多思考、多實踐。多看一些優秀的源碼和工程,例如JDK源碼,可以了解好的編碼習慣和風格,并且通過熟悉底層的原理,有助于寫出高性能和健壯的程序;再例如Tomcat源碼,阿里Dubbo源碼等,從中學習軟件設計思維。最后還需要多練習實踐。

    三. JVM概述

    1.Java內存區域管理

    Java內存區域包括兩部分:由所有線程共享的數據區和線程隔離的數據區,如圖所示:

    在線程隔離的數據區中,包括虛擬機棧、本地方法棧和程序計數器。程序計數器可以指示當前線程所執行的字節碼的行號,字節碼解釋器會通過更改計數器的值來選取下一條需要執行的字節碼指令。每個線程的程序計數器都是獨立的,確保各線程間計數器互不影響。虛擬機棧也是線程私有的,生命周期和線程相同,每個方法執行時會創建一個棧針、當前執行方法的局部變量表、操作數、動態鏈接、方法出口等信息都存儲在該區域中。方法的調用和返回對應的棧針在虛擬機棧中的入棧和出棧操作中。本地方法棧的作用與虛擬機棧類似,不過本地方法棧存儲的是調用native方法時使用的數據結構。方法區是各個線程共享的內存區域,它用于存儲已被虛擬機加載的類信息、常量和靜態變量等數據。堆也是共享內存區域,存儲對象實例、JVM的垃圾回收等。

    2.垃圾回收

    Java的垃圾回收機制中,首先需要確定哪些對象需要進行垃圾回收,這里通常采用可達性分析來進行判斷。這個算法的基本思想是設置一系列對象作為起點,稱為GC Roots節點,搜索建立引用鏈,當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的。在進行可達性分析時,需要讓整個系統凍結在某個時間點,對外則表現為所有工作進程都停止,如此才可以準確獲取所有GC Roots,這個過程稱為stop the world。此外,引用計數器算法也可以判斷對象是否存活,雖然該算法效率較高,但如果存在對象間的循環引用,即使這些對象不可訪問,也存在無法回收的情況。

    在回收對象實例時,有多種算法可供選擇。第一種標記-清除算法,分為兩個階段,首先標記出所有需要回收的對象,然后統一進行回收。第二種復制算法,針對方法一中內存碎片過多的缺點,復制算法將內存按照容量劃分為大小相同的兩塊,每次只使用其中的一塊,當一塊用完后,將仍存活的對象復制到另一塊中,然后將使用的那塊空間一次性清理,如此反復使用。第三種標記-整理算法,針對方法二中內存利用率不高的缺點進行改進,過程和方法一類似,首先對對象進行標記,然后將仍存活的對象向一端移動,然后清理邊界以外的內存區域。方法四分代收集算法,將堆劃分為新生代和老年代,根據對象的生命周期,分別放入不同的內存區域中,同時針對不同垃圾回收特點的對象采用不同的回收策略。新生代分為一塊較大的Eden區和兩個較小的survival區,因為新生代大部分對象都需要回收,所以采用復制算法進行回收。而老年代中需要回收的對象較少,因此采用標記-清除或者標記-整理算法進行回收。基于上述垃圾回收算法,JVM實現了多個垃圾收集器,可以通過一些參數進行設定(具體內容可參考擴展閱讀)。

    四. 面向對象入門

    在Java語言中,所有類都擁有一個共同的父類Object,即便沒有顯式聲明。接下來展示Object的一些方法,如下圖所示:

    首先,它包含一個private方法refisterNatives(),該方法與本地注冊有關,這里不做詳細討論。其次,它包含notify()和notifyAll()方法,這兩種方法比較類似,歸并為一類,另包含三種wait()方法,也歸為一類。因此Object類共包含8種方法,分為以下四類進行講解。

    他們分別回答了四個問題:我是誰,我從哪里來,我到哪里去,我與外界如何互相作用的。getClass和hashCode分別讓外界知曉當前對象的類型和一個獨一無二的標識。equals告訴外界當前對象是否和另一個對象相等。toString用字符串標識當前對象信息。clone方法可以讓外界獲得當前對象的一個拷貝。finalize方法可以實現對象被回收前最后的清理工作。notify()和notifyAll()方法用于喚醒一個等待在該對象上的一個線程或所有線程。wait方法是讓當前線程進入等待狀態,直至被喚醒或者等待時間結束。注意這里clone方法和finalize方法使用灰色表示,因為二者都屬于protected方法,如果需使用則需要重寫其實現。另外在重寫clone還要注意深拷貝和淺拷貝的問題,finalize方法使用時具有不確定性,這里不推薦大家使用。

    五. 示例演示

    1.整體示例

    在類Phone中,定義了兩個屬性brand和serialNum,代表品牌和序列號。在構造函數中,為兩個屬性初始化值。同時實現了clone接口,覆蓋了父類實現。

    在main函數中,定義了phone1和phone2,phone2是phone1的拷貝,然后打印出兩個變量的基本信息,包括手機的類名稱、hashCode、表示當前手機的字符串和對比兩個手機是否相同。運行結果如下所示:

    由運行結果可見,二者屬于同一個類,但hashCode不同,并且字符串表示也不相同。接下來仔細介紹每個方法。hashCode方法為native,表明調用的本地方法,代碼由非Java代碼寫出。hashCode返回一個int數值,代表內存空間中的一個地址。

    equals方法如下所示,用雙等號來對比兩個對象,注意因為此處兩變量都為引用類型,因此這里雙等號對比的是二者引用的內存地址是否一致。上例中由打印出的hashCode可見二者內存地址不一致,因此equals方法返回false。

    toString方法中,首先打印類名稱,加上@,還有內存地址空間的十六進制表示。

    但某些情況下我們認為如果phone的品牌和序列號一致即為二者一致,此時便需要嘗試修改一些方法的實現。這里可以使用IDE工具自動生成generate的部分代碼(具體操作詳見視頻),如下所示:

    此時在equals中,首先比較二者的內存地址空間,如果一致返回true;若不一致則進一步比較二者的類信息,若類不一致,則返回false,若一致,則需要繼續比較其屬性值,若屬性值都一致,則可以認為二者是相同的對象。hashCode中也類似,使用其兩個屬性值生成hashCode。

    類似的也可以生成toString的實現,使用StringBuffer類來拼接字符串,打印出相關屬性值。此時再運行主函數,得出結果如下:

    此時兩個變量的hashCode值已經一致,用字符串表示時也會打印出一些屬性信息,對比結果也返回true。

    2.深淺拷貝示例

    類Screen中,包含屬性值size,表示屏幕大小。并且有getSize方法獲取屏幕大小以及setSize方法設置size。toString方法將size值打印出來。

    接著在上例Phone類中加入屬性值Screen,并且更新構造函數,加入獲取和更新屏幕的方法,如下所示:

    重新編寫main()函數。首先定義了大小為5的屏幕,phone1和phone2與上例一致,只是phone1新增了參數變量screen。分別打印出兩個phone的屏幕大小,然后更改screen的值,再打印一次,運行結果如下所示:

    由結果可見,在更改screen大小之前,兩個phone的屏幕大小都為5,更改完成后都變為6。這表明此處默認的clone方法實現的為淺拷貝。因為screen中存儲的為內存地址空間,拷貝后的對象存儲的依然是該地址,因此改變屏幕size時二者同時變化。下面展示深拷貝,代碼如圖所示:

    首先從super.clone中獲得phone變量,為其重新設置屏幕大小,設置的值為調用當前screen的clone方法,最后返回變化后的拷貝。運行結果如下所示:

    此時可以看到在第二次更改完size之后,只有phone1的屏幕大小變為6,而phone2的屏幕大小仍然為之前的值。

    在學習JAVA編程的同學們,可以加我們的學習交流

    QQ群:370161306群內有相關學習資料

    總結

    以上是生活随笔為你收集整理的叮!您收到一份超值Java基础入门资料!的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。