Java入門級概述

哪 吒 2021-09-19 08:06:23 阅读数:694

java 概述

Java學習路線:搬磚工逆襲Java架構師

簡介:Java領域優質創作者、CSDN哪吒公眾號作者 、Java架構師奮鬥者

掃描主頁左側二維碼,加入群聊,一起學習、一起進步 

歡迎點贊 收藏 留言   

一、語言的五大特性

1、萬物皆對象

2、程序就是多個對象彼此調用方法的過程

3、從內存角度而言,每個對象都是由其它更基礎的對象組成的

4、每一個對象都有類型,都可以進行實例化

5、同一類型的對象可以接收相同的消息

面向對象編程的最大挑戰就是如何在問題空間的元素和解决方案空間的對象之間建立一對一的關聯。

二、類

類的創建者負責在創建新的類時,只暴露必要的接口給客戶程序員,同時隱藏其它所有不必要的信息。

為什麼這麼做呢?

1、因為如果這些信息對於客戶程序員而言是不可見的,那麼類的創建者就可以任意修改隱藏信息,而無需擔心對其它任何人造成影響。隱藏的代碼通常代錶著一個對象內部脆弱的部分,如果輕易暴露給粗心或經驗不足的客戶程序員,就可能在頃刻之間被破壞殆盡。所以,隱藏代碼的具體實現可以有效减少程序bug。

2、讓類庫的設計者在改變類的內部工作機制時,不用擔心影響到使用該類的客戶程序員。

Java提供了三個顯示關鍵字來控制訪問權限

修飾詞 本類 同一個包的類 繼承類 其他類
private × × ×
無(默認) × ×
protected ×
public

三、對象間的四種關系

1、依賴

依賴關系錶示一個類依賴於另一個類的定義。例如,一個人(Person)可以買車(car)和房子(House),Person類依賴於Car類和House類的定義,因為Person類引用了Car和House。與關聯不同的是,Person類裏並沒有Car和House類型的屬性,Car和House的實例是以參量的方式傳入到buy()方法中去的。一般而言,依賴關系在Java語言中體現為局域變量、方法的形參,或者對靜態方法的調用。 

2、關聯

關聯(Association)關系是類與類之間的聯接,它使一個類知道另一個類的屬性和方法。關聯可以是雙向的,也可以是單向的。在Java語言中,關聯關系一般使用成員變量來實現。 

3、聚合

聚合(Aggregation) 關系是關聯關系的一種,是强的關聯關系。聚合是整體和個體之間的關系。例如,汽車類與引擎類、輪胎類,以及其它的零件類之間的關系便整體和個體的關系。與關聯關系一樣,聚合關系也是通過實例變量實現的。但是關聯關系所涉及的兩個類是處在同一層次上的,而在聚合關系中,兩個類是處在不平等層次上的,一個代錶整體,另一個代錶部分。 

4、組合

組合(Composition) 關系是關聯關系的一種,是比聚合關系强的關系。它要求普通的聚合關系中代錶整體的對象負責代錶部分對象的生命周期,組合關系是不能共享的。代錶整體的對象需要負責保持部分對象和存活,在一些情况下將負責代錶部分的對象湮滅掉。代錶整體的對象可以將代錶部分的對象傳遞給另一個對象,由後者負責此對象的生命周期。換言之,代錶部分的對象在每一個時刻只能與一個對象發生組合關系,由後者排他地負責生命周期。部分和整體的生命周期一樣。 

三、封裝、繼承、多態

1、封裝

封裝就是把對象的屬性和行為結合為一個獨立的整體,並盡可能多的隱藏對象的內部實現細節。

2、繼承

對象用來封裝數據和功能,但我們要創建一個新類,然而它又與已存在的類具有部分相同的屬性或功能,此時,為了代碼複用原則,可以使用繼承來實現。

繼承通過基類和子類的概念來錶達,基類的所有特征和行為都可以與子類共享。也就是說,你可以通過基類呈現核心思想,從基類繼承的子類則為核心思想提供不同的實現方式。

有時基類和子類的方法都是一樣的,這時你就可以直接用子類的對象代替基類的對象,這種純替代關系通常叫做替換原則。

有時,子類會添加一些新的方法,此時就是不完美替換。

3、多態

通過將子類對象引用賦給父類對象引用來實現動態方法調用。

List<String> list = new ArrayList<String>();

四、單根層次結構

Java就是一個很明顯的單根層次結構的語言,所有的類都繼承自Object類。

單根層次結構有利於實現垃圾回收期,這也是Java對比C++的一個重要改進。

异常也是一樣的,异常的根類是Throwable,Throwable的直接子類是Exception和Error。

五、集合

通常情况下解决一個問題可能需要多個對象,也無法確切的知道要申請多大的內存空間,這時我們可以建一個新的對象,囊括你所需要的一切,這個新對象就稱為集合。

Java中最重要的集合有list、map、set、queue、tree、stack等。

常用集合的分類:

Collection 接口的接口 對象的集合(單列集合)
├——-List 接口:元素按進入先後有序保存,可重複
│—————-├ LinkedList 接口實現類, 鏈錶, 插入删除, 沒有同步, 線程不安全
│—————-├ ArrayList 接口實現類, 數組, 隨機訪問, 沒有同步, 線程不安全
│—————-└ Vector 接口實現類 數組, 同步, 線程安全
│ ———————-└ Stack 是Vector類的實現類
└——-Set 接口: 僅接收一次,不可重複,並做內部排序
├—————-└HashSet 使用hash錶(數組)存儲元素
│————————└ LinkedHashSet 鏈錶維護元素的插入次序
└ —————-TreeSet 底層實現為二叉樹,元素排好序

Map 接口 鍵值對的集合 (雙列集合)
├———Hashtable 接口實現類, 同步, 線程安全
├———HashMap 接口實現類 ,沒有同步, 線程不安全-
│—————–├ LinkedHashMap 雙向鏈錶和哈希錶實現
│—————–└ WeakHashMap
├ ——–TreeMap 紅黑樹對所有的key進行排序
└———IdentifyHashMap

Java集合基礎知識總結(絕對經典)

六、泛型

在Java5之前,JAVA語言的集合所支持的通用類型是Object。因為單根結構决定了所有對象都屬於Object類型,所以一個持有Object的集合就可以持有任何對象,這就使得集合十分易於複用。

其實並不能保存原始數據類型,不過自動裝箱機制在一定程度上解决了這個問題。

當集合中持有Object類型時,要添加一個對象到集合中,該對象會向上轉型為Object,從而失去了原本的類型。當你需要將其取出時,會獲得一個Object類型的對象引用,這就不是當初的類型了,需要進行向下轉型。但除非明確知道對象的具體類型,否則向下轉型是不安全的,轉型失敗會拋出异常。

這個問題的解决方式是“參數化類型”,一個被參數化的類型是一種特殊的類,可以讓編譯器自動適配特定的類型,參數化類型也叫泛型,通過尖括號中間加上類名來定義泛型,比如List<String>。

【Java知識點詳解 4】Java泛型詳解

七、對象的創建和聲明周期

對象的創建需要消耗一些資源,尤其是內存資源。

當我們不再需要一個對象時,就要及時清理它,這樣占用的資源才能被釋放並重複使用。

如果要最大化運行時效率,可以通過棧區(局部變量)來保存對象,或者將對象保存在靜態區裏,這樣在編寫程序時就可以明確的知道對象的內存分配和生命周期,這種做法會優先考慮分配和釋放內存的速度。但是代價就是犧牲了靈活性,因為你必須在編寫代碼時就明確對象的數量、生命周期以及類型,但是這種寫法的限制性很大。

還有一種方案是在內存池中動態創建對象,這個內存池也就堆。如果使用這個方案,直到運行時你才能知道需要多少對象,以及它們的生命周期和確切的類型是什麼。如果需要創建一個新對象,可以直接通過堆來創建。因為堆是在運行時動態管理內存的,所以堆分配內存所花費的時間通常會比棧多一些。棧通常利用匯編指令向下或向上移動棧指針來管理內存,而堆何時分配內存則取决於內存機制的實現方式。

Java只允許動態分配內存,每當要創建一個對象時,都需要使用new來創建一個對象的動態實例。

如果在棧中創建對象,編譯器會判斷對象存在時間以及負責自動銷毀該對象。

如果在堆中創建對象,編譯器就無法得知對象的生命周期。

Java支持垃圾回收機制,它會自動找到沒用的對象將其銷毀。

八、异常處理

异常處理是將編程語言和錯誤處理機制直接綁定在一起,异常從錯誤發生處拋出,根據錯誤類型,可以對其進行捕獲。由於异常的存在,降低了編寫代碼的成本,不用經常反複檢查各種錯誤。

如果拋出异常,就確保了它會被有效的處理,這也增强了程序的健壯性。

Java的异常處理機制在眾多編程語言中幾乎可以說是鶴立雞群的,异常時Java唯一允許的報錯方式,如果你的代碼沒有正確的處理异常,就會得到一條編譯時的報錯消息。

️詳解Java异常️代碼報錯怎麼辦,try catch蓋住不就好了?

九、數據保存在哪裏

1、寄存器

寄存器是速度最快的數據存儲方式,數據直接保存在中央處理器,然而寄存器的數量是有限的,所以只能按需分配。

JVM中有4種常見的寄存器:

  1. pc程序寄存器
  2. optop操作數棧頂指針
  3. frame當前執行環境指針
  4. vars指向當前執行環境中第一個局部變量的指針

所有寄存器都為32比特。

pc用於記錄程序的執行,optop,frame和vars用於記錄指向Java棧區的指針。

2、棧

數據存儲在隨機存取存儲器裏,處理器可以通過棧指針直接操作該數據。具體來說,棧指針向下移動將申請一塊新的內存,向上移動則會釋放這塊內存。這是一種及其迅速和高效的內存分配方式,其效率僅次於寄存器。只不過Java系統在創建應用程序時就必須明確棧上所有對象的生命周期。這種限制約束了程序的靈活性,因此雖然有一些數據會保存在棧上,對象本身卻並非如此。

3、堆

堆是一個通用的內存池,用於存放所有Java對象,new出來的對象都存放在堆中。堆內存的分配和清理要比棧存儲話費更多的時間。

4、常量存儲

常量通常會直接寫在程序代碼中,不可變。

5、非RAM存儲

不保存在應用程序裏的數據,最典型的例子就是序列化對象,它指的是轉換為字節流並可以發送到其它機器的對象。另一個例子則是持久化對象,它指的是保存在磁盤上的對象。也支持使用數據庫存儲對象信息。

大多數微處理芯片有額外的緩存內存,只不過緩存內容使用的是傳統的內存管理方式,而非寄存器。

一個例子是字符串常量池,所有字符串和字符串常量都會被自動放置到這個特殊的存儲空間中。

特殊情况 -> 原始類型

原始類型是直接創建一個“自動變量”,不是引用,該變量直接在棧上保存它的值,運行效率更高。

十、Java中的一些常見概念

1、數組

Java的數組一定會被初始化,並且無法訪問數組邊界之外的元素,這種邊界檢查的代價是需要消耗少許內存,以及運行時需要少量時間來驗證索引的正確性。當創建一個放置對象的數組時,實際上數組裏包含的是引用,這些引用都有一個特殊的值null,Java會認為null的引用沒有指向任何對象,所以當你操作引用之前,需要確保將其指向了某個對象。如果你試圖操作一個值為null的引用,系統會返回一個運行時錯誤。

2、移比特操作符

移比特操作符也操縱二進制比特,它們只能用來處理基本類型裏的整數類型。左移比特操作符(<<)會將操作符左側的操作數向左移動,移動的比特數在操作符右側指定(低比特補0)。“有符號”的右移比特操作符(>>)則按照操作符右側指定的比特數將操作符左側的操作數向右移動。“有符號”的右移比特操作符使用了“符號擴展”:如果符號為正,則在高比特插入0,否則在高比特插入1。

3、按比特操作符

按比特操作符用來操作整數基本數據類型中的單個二進制比特(bit)。按比特操作符會對兩個參數中對應的二進制比特執行布爾代數運算,並生成一個結果。

4、三元運算符

相當於ifelse。

聯系作者,或者掃描作者主頁二維碼加群,加入我們吧

推薦閱讀

Java學習路線總結️搬磚工逆襲Java架構師️(全網最强,建議收藏)

️連續面試失敗後,我總結了57道面試真題️,如果時光可以倒流...(附答案,建議收藏)

10萬字208道Java經典面試題總結(附答案,建議收藏)

MySql基礎知識總結(2021版)

MySql基礎知識總結(SQL優化篇)

【Vue基礎知識總結 1】Vue入門

【100天算法入門 - 每日三題 - Day1】二叉樹的中序遍曆、兩數之和、整數反轉

版权声明:本文为[哪 吒]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210919080622854a.html