Java基礎概念<最通俗易懂的講解>

目錄:java

1、JDK 和 JRE 的區別?git

2、final 與 static 的區別?面試

3、get和post的區別?數組

4、堆和棧的概念和區別 瀏覽器

5、淺談Java反射機制緩存

1、JDK 和 JRE 的區別?安全

JDK:java development kit (java開發工具)服務器

JRE:java runtime environment (java運行時環境)框架

JVM:java virtuak machine (java虛擬機)jvm

一、jdk--開發環境(核心)

Java development kit的縮寫,意思是Java開發工具,咱們寫文檔作PPT須要office 辦公軟件,開發固然須要開發工具了,說到開發工具你們確定會想到Eclipse,可是若是直接安裝Eclipse你會發現它是運行不起來 是會報錯的,只有安裝了JDK,配置好了環境變量和path才能夠運行成功。這點相信不少人都深有體會。

jdk主要包含三個部分:

第一部分是Java運行時環境,JVM

第二部分是Java的基礎類庫,這個類庫的數量仍是至關可觀的

第三部分是Java的開發工具,它們都是輔助你更好地使用Java的利器

詳尋《玩好JDK,面試不用愁

二、jre--運行環境

① jdk中的jre

以下圖:jdk中包含的jre,在jre的bin目錄裏有個jvm.dll,既然JRE是運行時環境,那麼運行在哪?確定是JVM虛擬機上了。另,jre的lib目錄中放的是一些JAVA類庫的class文件,已經打包成jar文件。

② 第二個JRE(獨立出來的運行時環境)

以下圖,不論是JDK中的JRE仍是JRE既然是運行時環境必須有JVM。因此JVM也是有兩個的。

三、JVM——轉換環境

java virtuak machine (java虛擬機)的縮寫。

你們一提到JAVA的優勢就會想到:一次編譯,隨處運行,說白了就是跨平臺性好,這點JVM功不可沒。

Java的程序也就是咱們編譯的代碼都會編譯爲class文件,class文件就是在jvm上運行的文件,只有JVM還不能徹底支持class的執行,由於在解釋class的時候JVM須要調用解釋所須要的類庫lib,而jre包含lib類庫。

JVM屏蔽了與具體操做系統平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就能夠在多種平臺上不加修改的運行。

JVM也是一門很深的學問,感興趣的同窗能夠深刻研究,只有好處,沒有壞處。

其實有時候面試官問JDK和JRE的區別的目的不是想讓你解釋什麼名詞的,而是想看看你的基礎和研究Java的深淺,還有另外一方面就是你是否是常常喜歡問爲何。

2、final 與 static 的區別?

均可以修飾類、方法、成員變量

static能夠修飾類的代碼塊,final不能夠

static不能夠修飾方法內局部變量,final能夠

 

static修飾表示靜態或全局

static修飾的代碼塊表示靜態代碼塊,當JVM加載類時,只會被建立一次

static修飾的變量能夠從新賦值

static方法中不能用this和super關鍵字

由於this表明的是調用這個函數的對象的引用,而靜態方法是屬於類的,不屬於對象,靜態方法成功加載後, 對象還不必定存在。 this表明對本類對象的引用,指向本類已建立的對象。 super表明對父類對象的引用,指向父類對象。 靜態優先於對象存在,方法被static修飾以後,方法先存在,所需的父類引用對象晚於該方法的出 現,也就是super所指向的對象還沒出現,固然就會報錯。

static方法必須被實現,而不能是抽象的abstract

static方法只能被static方法覆蓋

 

final修飾表示常量、一旦建立不可被修改

final標記的成員變量必須在聲明的同時賦值,或在該類的構造方法中賦值,不可從新賦值

final方法不能被子類重寫

final類不能被繼承,沒有子類,final類中的方法默認是final的

final不能用於修飾構造方法

private類型的方法默認是final類型的

3、get和post的區別?

get和post是表單提交的兩種方式,get請求數據經過域名後綴URL傳送,用戶可見,不安全,post請求數據經過在請求報文正文裏傳輸,相對比較安全。get是經過URL傳遞表單值,post經過URL看不到表單域的值。

get傳遞的數據量是有限的,若是要傳遞大數據量不能用get,不如type=「file」上傳文章、type=「password」傳遞密碼,get和post是表單提交數據的兩種方式,get請求數據經過地域名後綴URL傳送,用戶可見,不安全,post請求數據經過將在請求報文正文裏傳輸,相對比較安全。

get是經過url傳遞表單值,post經過url看不到表單域的值;

get傳遞的數據量是有限的,若是要傳遞大數據量不能用get,好比type=「file」上傳文章、type=「password」傳遞密碼或者< text area >發表大段文章,post則沒有這個限制;

post會有瀏覽器提示從新提交表單的問題,get則沒有(加分的回答)

對於Post的表單從新敲地址欄再刷新就不會提示從新提交了,由於從新敲地址就沒有偷偷提交的數據了。Post方式的正確的地址很難直接發給別人。

get和post的區別

1.get提交的數據放在URL以後,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. post方法是把提交的數據放在HTTP包的body中。

2.get提交的數據大小有限制(由於瀏覽器對URL的長度有限制),而post方法提交的數據沒有限制。

3.get方式須要使用request.querystring來取得變量的值,而post方式經過request.form來獲取變量的值。

4.get方式提交數據會帶來安全問題,好比一個登錄頁面,經過get提交數據時,用戶名和密碼將出如今URL中,若是頁面能夠被緩存或者其餘人能夠訪問這臺機器 ,就能夠從歷史記錄得到該用戶的帳戶和密碼。

get是從服務器獲取數據,post向服務器傳送數據。

get是把參數數據隊列加到提交表單的action屬性所指的URL中,值和表單內各個字段一一對應,在URL中能夠看到。post是經過HTTP post機制,將表單內各個字段與其內容放置在HTML.header內一塊兒傳送到action屬性所指的URL地址。用戶看不到這個過程。

對於get方式,服務器端用request.querystring獲取變量的值,對於post方式,服務器端用request.form獲取提交的數據

get傳送的數據量較小,不能大於2KB.POST傳送的數據量較大,通常被默認爲不受限制。但理論上,限制取決於服務器的處理能力。

get安全性較低。post安全性較高。

4、堆和棧的概念和區別 

在說堆和棧以前,先說一下JVM(虛擬機)內存的劃分:

Java程序在運行時都要開闢空間,任何軟件在運行時都要在內存中開闢空間,Java虛擬機運行時也是要開闢空間的。JVM運行時在內存中開闢一片內存區域,啓動時在本身的內存區域中進行更細緻的劃分,由於虛擬機中每一片內存處理的方法都不一樣,因此要單獨進行管理。

JVM內存的劃分有五片:

1.寄存器

2.本地方法區

3.方法區

4.棧內存

5.堆內存

咱們來重點說一下堆和棧:

棧內存:棧內存首先時一片內存區域,存儲的都是局部變量,凡是定義在方法中的都是局部變量,for循環內部定義的也是局部變量,是先加載函數才能進行局部變量的定義,因此方法先進棧,而後再定義變量,變量有本身的做用於,一旦離開做用域,變量就會被釋放。棧內存的更新速度很快,由於局部變量的聲明週期都很短。

堆內存:存儲的是數組和對象(其實數組就是對象),凡是new創建的都是在堆中,堆中存放的都是實體(對象),實體用於封存數據,並且是封存多個(實體的多個屬性),若是一個數據消失,這個實體也沒有消失,還能夠用,因此堆是不會隨時釋放的,可是棧不同,棧裏存放的都是單個變量,變量被釋放了,也就沒有了。堆裏的實體雖然不會被釋放,可是會被當作垃圾,Java有垃圾回收機制不定時的收取。

下面咱們經過一個圖例詳細講一下堆和棧:

好比主函數裏的語句

int[] arr = new int[3];

在內存中是怎麼被定義的:

主函數先進棧,在棧中定義一個變量arr,接下來爲arr賦值,可是右邊不是一個具體值,是一個實體。實體建立在堆裏,在堆裏首先經過new關鍵字開闢一個空間,內存在存儲數據的時候都是經過地址來實現的,地址是一塊連續的二進制,而後給這個實體分配一個內存地址。數組都有一個索引,數組這個實體在堆內存中產生以後每個空間都會默認的初始化(這是堆內存的特色,未初始化的數據是不能用的,可是在堆裏是能夠用的,由於初始化過了,可是棧裏沒有),不一樣的類型初始化的值不同,因此堆和棧裏就建立了變量和實體:

811074f2109816f6bf7c8bd988418fefe96.jpg

那麼堆和棧怎麼聯繫起來的呢?

咱們剛剛說郭給堆分配一個地址,把堆的地址賦給arr,arr就經過地址只想了數組。因此arr想操做數組時,就經過地址,而不是直接把四蹄都賦給它。這種咱們再也不叫它基本數據類型,而叫引用數據類型。稱爲arr引用了堆內存當中的實體

c31374505d08d271df9da1ff52044137c62.jpg

若是當int[] arr = null;

arr不作任何指向,null的做用就是取消引用數據類型的指向。

當一個實體,沒有引用數據類型指向的時候,它在堆內存中不會被釋放,而被看成一個垃圾,在不定時的時間內自動回收,由於Java有一個自動回收機制。自動回收機制自動監測堆裏是否有垃圾,若是有,就會自動的作垃圾回收的動做,可是何時回收不必定。

因此堆和棧的區別很明顯:

1.棧內存存儲的是局部變量而堆內存存儲的是實體;

2.棧內存的更新速度要快於堆內存,由於局部變量的聲明週期很短;

3.棧內存存放的變量聲明週期一旦結束就會被釋放,而堆內存存放的實體會被垃圾啊回收機制不定時的回收。

5、淺談Java反射機制

一、反射的定義是什麼?

Java反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法,這種動態獲取、調用對象方法的功能成爲Java語言的反射機制。

二、反射存在的必要性?

反射機制是不少Java框架的基石。

① 在xml文件或properties裏面寫好了配置,而後再Java類裏面解析xml或properties裏面的內容,獲得一個字符串,而後用反射機制,根據這個字符串得到某個類的Class實例,這樣就能夠動態配置一些東西,不用每一次都要在代碼裏去new或者作其它事情,之後要改的話直接改配置文件,代碼維護起來就很方便了。

② 有時候要適應某些需求,Java類裏面不必定能直接調用另外的方法,這時候也能夠經過反射機制來實現。

三、反射的缺點?

反射的代碼比正常調用的代碼更多,性能更慢,應避免使用反射。

 

素小暖講Java@目錄

相關文章
相關標籤/搜索