“你學習一門技術的最佳時機是三年前蟆炊,其次是現(xiàn)在∑僦荆”這句話對于哪一種行業(yè)都很適用涩搓,如果你已經學習過Java,那么恭喜你你很有先見之明后室,如果你并不了解Java缩膝,Java培訓老師分享的這篇文章帶你快速掌握Java的幾個核心知識點。
一岸霹、Java特點
1、面向對象
盡管受到其前輩的影響将饺,但Java沒被設計成兼容其他語言源代碼的程序贡避。這允許Java開發(fā)組自由地從零開始。這樣做的一個結果是予弧,Java語言可以更直接刮吧、更易用、更實際的接近對象掖蛤。Java的對象模型既簡單又容易擴展杀捻,對于簡單數(shù)據(jù)類型,例如整數(shù)蚓庭,它保持了高性能致讥,但不是對象仅仆。
小編推薦一個學JAVA的學習裙【 一三三,九三零垢袱,六九三】墓拜,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習请契!裙內有開發(fā)工具咳榜,很多貨和技術資料分享!
2爽锥、解釋性和高性能
字節(jié)碼可以在提供Java虛擬機(JVM)的任何一種系統(tǒng)上被解釋執(zhí)行涌韩。早先的許多嘗試解決跨平臺的方案對性能要求都很高。其他解釋執(zhí)行的語言系統(tǒng)氯夷,如BASIC臣樱,Tcl,PERL都有無法克服的性能缺陷肠槽。然而擎淤,Java卻可以在非常低檔的CPU上順利運行。前面已解釋過秸仙,Java確實是一種解釋性語言嘴拢,Java的字節(jié)碼經過仔細設計,因而很容易便能使用JIT編譯技術將字節(jié)碼直接轉換成高性能的本機代碼寂纪。Java運行時系統(tǒng)在提供這個特性的同時仍具有平臺獨立性席吴,因而“高效且跨平臺”對Java來說不再矛盾。
3捞蛋、動態(tài)
Java程序帶有多種的運行時類型信息孝冒,用于在運行時校驗和解決對象訪問問題。這使得在一種安全拟杉、有效的方式下動態(tài)地連接代碼成為可能庄涡,對小應用程序環(huán)境的健壯性也十分重要,因為在運行時系統(tǒng)中搬设,字節(jié)碼內的小段程序可以動態(tài)地被更新穴店。
二、面向對象的編程
2.1 抽象
面向對象編程的一個實質性的要素是抽象拿穴。人們通過抽象(abstraction)處理復雜性泣洞。
例如,人們不會把一輛汽車想象成由幾萬個互相獨立的部分所組成的一套裝置默色,而是把汽車想成一個具有自己獨特行為的對象球凰。這種抽象使人們可以很容易地將一輛汽車開到雜貨店,而不會因組成汽車各部分零件過于復雜而不知所措。傳統(tǒng)的面向過程程序的數(shù)據(jù)經過抽象可用若干個組成對象表示呕诉,程序中的過程步驟可看成是在這些對象之間進行消息收集缘厢。這樣,每一個對象都有它自己的獨特行為特征义钉。你可以把這些對象當作具體的實體昧绣,讓它們對告訴它們做什么事的消息作出反應。這是面向對象編程的本質捶闸。面向對象的概念是Java 的核心夜畴。
2.2面向對象編程的3個原則
所有面向對象的編程語言都提供幫助你實現(xiàn)面向對象模型的機制,這些機制是封裝删壮,繼承及多態(tài)性√盎妫現(xiàn)在讓我們來看一下它們的概念。
封裝
封裝(Encapsulation)是將代碼及其處理的數(shù)據(jù)綁定在一起的一種編程機制央碟,該機制保證了程序和數(shù)據(jù)都不受外部干擾且不被誤用税灌。理解封裝性的一個方法就是把它想成一個黑匣子,它可以阻止在外部定義的代碼隨意訪問內部代碼和數(shù)據(jù)亿虽。對黑匣子內代碼和數(shù)據(jù)的訪問通過一個適當定義的接口嚴格控制菱涤。
Java封裝的基本單元是類。盡管類將在以后章節(jié)詳細介紹÷迕悖現(xiàn)在仍有必要對它作一下簡單的討論粘秆。類是一種邏輯結構,而對象是真正存在的物理實體收毫。如果你對C/C++熟悉攻走,可以這樣理解:Java程序員所稱的方法,就是C/C++程序員所稱的函數(shù)(function)此再。在完全用Java編寫的程序中昔搂,方法定義如何使用成員變量。這意味著一個類的行為和接口是通過方法來定義的输拇,類這些方法對它的實例數(shù)據(jù)進行操作摘符。
繼承
繼承(Inheritance)是一個對象獲得另一個對象的屬性的過程。繼承很重要策吠,因為它支持了按層分類的概念议慰。使用了繼承,一個對象就只需定義使它在所屬類中獨一無二的屬性即可奴曙,因為它可以從它的父類那兒繼承所有的通用屬性。
繼承性與封裝性相互作用草讶。如果一個給定的類封裝了一些屬性洽糟,那么它的任何子類將具有同樣的屬性,而且還添加了子類自己特有的屬性。這是面向對象的程序在復雜性上呈線性而非幾何性增長的一個關鍵概念坤溃。新的子類繼承它的所有祖先的所有屬性拍霜。它不與系統(tǒng)中其余的多數(shù)代碼產生無法預料的相互作用。
小編推薦一個學JAVA的學習裙【 一三三薪介,九三零祠饺,六九三】,無論你是大牛還是小白汁政,是想轉行還是想入行都可以來了解一起進步一起學習道偷!裙內有開發(fā)工具,很多干貨和技術資料分享记劈!
多態(tài)性
多態(tài)性是允許一個接口被多個同類動作使用的特性勺鸦,具體使用哪個動作與應用場合有關,下面我們以一個后進先出型堆棧為例進行說明目木。假設你有一個程序换途,需要3種不同類型的堆棧。一個堆棧用于整數(shù)值刽射,一個用于浮點數(shù)值军拟,一個用于字符。盡管堆棧中存儲的數(shù)據(jù)類型不同誓禁,但實現(xiàn)每個棧的算法是一樣的懈息。如果用一種非面向對象的語言,你就要創(chuàng)建3個不同的堆棧程序现横,每個程序一個名字漓拾。但是,如果使用Java戒祠,由于它具有多態(tài)性骇两,你就可以創(chuàng)建一個通用的堆棧程序集,它們共享相同的名稱姜盈。多態(tài)性的概念經常被說成是“一個接口低千,多種方法”。這意味著可以為一組相關的動作設計一個通用的接口馏颂。多態(tài)性允許同一個接口被必于同一類的多個動作使用示血,這樣就降低了程序的復雜性。選擇應用于每一種情形的特定的動作(specific action)(即方法)是編譯器的任務救拉,程序員無需手工進行選擇难审。你只需記住并且使用通用接口即可。
三亿絮、hashmap hashtable
HashMap 是一個散列表告喊,它存儲的內容是鍵值對(key-value)映射麸拄。HashMap 繼承于AbstractMap,實現(xiàn)了Map黔姜、Cloneable拢切、java.io.Serializable接口。
HashMap 的實現(xiàn)不是同步的秆吵,這意味著它不是線程安全的淮椰。它的key、value都可以為null纳寂。此外主穗,HashMap中的映射不是有序的。HashMap的實例有兩個參數(shù)影響其性能:“初始容量” 和 “加載因子”烈疚。容量是哈希表中桶的數(shù)量黔牵,初始容量 只是哈希表在創(chuàng)建時的容量。加載因子 是哈希表在其容量自動增加之前可以達到多滿的一種尺度爷肝。當哈希表中的條目數(shù)超出了加載因子與當前容量的乘積時猾浦,則要對該哈希表進行 rehash 操作(即重建內部數(shù)據(jù)結構),從而哈希表將具有大約兩倍的桶數(shù)灯抛。
四. jvm 內存模型
程序計數(shù)器
每個線程有要有一個獨立的程序計數(shù)器金赦,記錄下一條要運行的指令。線程私有的內存區(qū)域对嚼。如果執(zhí)行的是JAVA方法夹抗,計數(shù)器記錄正在執(zhí)行的java字節(jié)碼地址,如果執(zhí)行的是native方法纵竖,則計數(shù)器為空漠烧。
虛擬機棧
線程私有的,與線程在同一時間創(chuàng)建靡砌。管理JAVA方法執(zhí)行的內存模型已脓。
本地方法區(qū)
和虛擬機棧功能相似,但管理的不是JAVA方法通殃,是本地方法
方法區(qū)
線程共享的度液,用于存放被虛擬機加載的類的元數(shù)據(jù)信息:如常量、靜態(tài)變量画舌、即時編譯器編譯后的代碼堕担。也稱為永久代。
JAVA 堆
線程共享的曲聂,存放所有對象實例和數(shù)組霹购。垃圾回收的主要區(qū)域∨笠福可以分為新生代和老年代(tenured)厕鹃。
小編推薦一個學JAVA的學習裙【 一三三兢仰,九三零,六九三】剂碴,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習轻专!裙內有開發(fā)工具忆矛,很多干貨和技術資料分享!
五请垛、運行時類型信息(RTTI + 反射)
概念—RTTI:運行時類型信息使得你可以在程序運行時發(fā)現(xiàn)和使用類型信息催训。
使用方式:Java是如何讓我們在運行時識別對象和類的信息的,主要有兩種方式(還有輔助的第三種方式宗收,見下描述):
一種是“傳統(tǒng)的”RTTI漫拭,它假定我們在編譯時已經知道了所有的類型,比如Shape s = (Shape)s1混稽;另一種是“反射”機制采驻,它運行我們在運行時發(fā)現(xiàn)和使用類的信息,即使用Class.forName()匈勋。其實還有第三種形式礼旅,就是關鍵字instanceof,它返回一個bool值洽洁,它保持了類型的概念痘系,它指的是“你是這個類嗎?或者你是這個類的派生類嗎饿自?”汰翠。而如果用==或equals比較實際的Class對象,就沒有考慮繼承—它或者是這個確切的類型昭雌,或者不是复唤。
工作原理
要理解RTTI在Java中的工作原理,首先必須知道類型信息在運行時是如何表示的城豁,這項工作是由稱為Class對象的特殊對象完成的苟穆,它包含了與類有關的信息。Java送Class對象來執(zhí)行其RTTI唱星,使用類加載器的子系統(tǒng)實現(xiàn)雳旅。
無論何時,只要你想在運行時使用類型信息间聊,就必須首先獲得對恰當?shù)腃lass對象的引用
反射與RTTI的區(qū)別
RTTI與反射之間真正的區(qū)別只在于:對RTTI來說攒盈,編譯器在編譯時打開和檢查.class文件(也就是可以用普通方法調用對象的所有方法);而對于反射機制來說哎榴,.class文件在編譯時是不可獲取的型豁,所以是在運行時打開和檢查.class文件僵蛛。
六、即時編譯器技術 — JIT
Java虛擬機中有許多附加技術用以提升速度迎变,尤其是與加載器操作相關的充尉,被稱為“即時”(Just-In-Time,JIT)編譯器的技術衣形。這種技術可以把程序全部或部分翻譯成本地機器碼(這本來是JVM的工作)驼侠,程序運行速度因此得以提升。當需要裝載某個類時谆吴,編譯器會先找到其.class文件倒源,然后將該類的字節(jié)碼裝入內存。此時句狼,有兩種方案可供選擇:
(1)一種就是讓即時編譯器編譯所有代碼笋熬。
(2)另一種做法稱為惰性評估(lazy evaluation),意思是即時編譯器只在必要的時候才編譯代碼腻菇,這樣胳螟,從不會被執(zhí)行的代碼也許就壓根不會被JIT所編譯。
七芜繁、final關鍵字
對final關鍵字的誤解
小編推薦一個學JAVA的學習裙【 一三三旺隙,九三零,六九三】骏令,無論你是大牛還是小白蔬捷,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發(fā)工具榔袋,很多干貨和技術資料分享周拐!
當final修飾的是基本數(shù)據(jù)類型時,它指的是數(shù)值恒定不變(就是編譯期常量凰兑,如果是static final修飾妥粟,則強調只有一份),而對對象引用而不是基本類型運用final時吏够,其含義會有一點令人迷惑勾给,因為用于對象引用時,final使引用恒定不變锅知,一旦引用被初始化指向一個對象播急,就無法再把它指向另一個對象。然而售睹,對象其自身卻是可以被修改的桩警,Java并未提供使任何對象恒定不變的途徑(但可以自己編寫類以取得使對象恒定不變的效果),這一限制同樣適用數(shù)組昌妹,它也是對象捶枢。
以上是千鋒武漢小編總結的我們在學習Java時需要掌握的基本點和一些關鍵的重難點握截。了解他們對我們學習Java很重要。