快速瀏覽
Sun公司在1991成立了一個名爲Green的小組,這個小組開發了Oak,這正是java的前身,最初的開發目的是爲了做家電的嵌入式應用,不過因爲缺乏硬件市場的支持並沒有受到大的關注。
1995的時候,互聯網開始崛起,這給了java機會。Sun公司首先推出了可以嵌入網頁並且可以隨同網頁在網絡上傳輸的Applet,並將Oak更名爲Java。
1996年1月,Sun公司發佈了Java的第一個開發工具包,這個工具包被命名爲JDK1.0,這標誌着Java正式成爲了一種獨立的開發工具。
1998年12月8日,第二代Java平臺的企業版J2EE發佈。
1999年6月,Sun公司發佈了第二代Java平臺的第3個版本:J2ME。
1999年4月27日,HotSpot虛擬機發布。HotSpot虛擬機發布時是作爲JDK 1.2的附加程序提供的,後來它成爲了JDK 1.3及之後所有版本的Sun JDK的默認虛擬機 。
2000年5月,JDK1.3、JDK1.4和J2SE1.3相繼發佈,幾周後其獲得了Apple公司Mac OS X的工業標準的支持。
2002年2月26日,J2SE1.4發佈。自此Java的計算能力有了大幅提升,與J2SE1.3相比,其多了近62%的類和接口,其中比較重要的更新有XML、Socket、正則表達式改進的I/O等。
2004年9月30日,J2SE1.5發佈。爲了表示該版本的重要性,J2SE 1.5更名爲Java SE 5.0。更新中包含了從1996年發佈1.0版本以來的最重大的更新,其中包括泛型、基本類型的自動裝箱、改進的循環、枚舉類型及可變參數。
2006年11月13日,Java技術的發明者Sun公司宣佈,將Java技術作爲免費軟件對外發布。從2007年3月起,全世界所有的開發人員均可對Java源代碼進行修改。
2009年,甲骨文公司宣佈收購Sun。
Applet是一種將小程序嵌入到網頁中進行執行的技術。
在申請註冊商標時,Sun發現Oak已經被人使用了,再想了一系列名字之後,最終,使用了提議者在喝一杯Java咖啡時無意提到的Java詞語。
技術架構
JAVASE:全稱 Java Platform Standard Edition,Java 2平臺的標準版,應用於桌面應用程序;
JAVAEE:Java Platform Enterprise Edition,企業版,應用於WEB開發;
JAVAME:Java Platform Micro Edition,微型版,應用於移動環境和嵌入式設備,例如安卓手機中的應用程序;
跨平臺的祕密
java的底層依靠虛擬機,不同的操作系統對應不同的java虛擬機。所以只需要在不同的操作系統中安裝對應虛擬機就可以實現不修改java源代碼就可以運行。
JRE和JDK
JDK:Java Development Kit,JDK中包含了JRE,JDK是java的開發工具。
JRE:Java Runtime Environment,java程序的運行環境,包含Java運行的所需的類庫和JVM。
JVM:Java Virtual Machine,Java虛擬機,是一種用於計算設備的規範,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。
環境搭建
配置環境變量:就是將在jdkbin目錄下指令告知當前系統,在需要使用對應指令的時候由系統根據指定目錄尋找指令。
經常被使用的兩個指令是javac和java指令,它們分別負責編譯和運行java程序。
javac:當執行javac的時候會啓動java的編譯器對.java文件進行編譯,也就是生成.class文件,這是jvm可以識別的字節碼文件。
java:會啓動jvm,加載運行需要的類庫,然後執行.class文件
永久配置方式:
JAVA_HOME=%安裝路徑%Javajdk
path=%JAVA_HOME%bin
CLASSPATH=;%JAVA_HOME%lib
臨時配置方式:
path:C:ProgramJavajdkbin
在定義classpath環境變量時,如果沒有定義環境變量classpath,java啓動jvm後,會在當前目錄下查找要運行的類文件;如果指定了classpath,那麼會在指定的目錄下查找要運行的類文件;如果classpath值中結尾處有分號那麼在指定目錄下沒有找到類文件的時候,會默認在當前目錄下找一次;如果classpath值中結尾處沒有分號在指定目錄下沒有找到類文件的時候會報錯。
一般寫分號,如果在指定目錄下沒有找到的話就讓它報錯,這樣方便調試程序。
註釋
單行註釋(single-line):// 一次只能註釋一行,一般是簡單註釋,用來簡短描述某個變量或屬性,程序塊。
塊註釋(block):/ 爲了進行多行簡單註釋,一般不使用。/
文檔註釋:/* 可以使用多行,一般用來對類、接口、成員方法、成員變量、靜態字段、靜態方法、常量進行說明。Javadoc可以用它來產生代碼的文檔。爲了可讀性,可以有縮進和格式控制。 /
語法規則
約定俗成的書寫規則
包名:package 的名字應該採用完整的英文描述符,由一個小寫單詞組成,並且包名的前綴是一個頂級域名,如com、net、org等
類名:class 名應該是個一名詞,採用大小寫混合的方式,每個單詞的首字母大寫。一般保證類名簡潔而富於描述。
常量:全部採用大寫字母,單詞之間儘量使用下劃線分割。
變量:不可以使用數字和下劃線開頭;不可以使用關鍵字。
變量有分成員變量和局部變量。成員變量直接定義在類中,作用於當前類,存在於堆內存中;局部變量可以定義在參數列表和方法內部,作用於當前方法,存在於棧內存中。
所有對象在創建的時候都需要初始化才能使用,做這個工作的是構造函數,其實就是一個與類名稱相同的方法,可以重載,不需要返回值。構造函數和一般函數之間的區別除了定義格式上之外還有就是構造函數只被執行一次。
數據類型
基本數據類型:byte、short、int、long、float、double、char、boolean
引用數據類型: 字符串、數組、枚舉、接口、對象。
運算符
算術運算符:+、-、*、/、%、+(連接符)、++、--
賦值運算符:=、+=、-=、*=、/=、%=
比較運算符(運算的結果要麼是true,要麼是false):>、<、==、>=、<=
邏輯運算符(用於連接兩個boolean表達式,除!之外):&、|、^、! (二元運算符)、&&(短路與) 、||(短路或)
位運算符(用於操作二進制位的運算符):<<、>>、>>>(無符號右移)
&: 只有兩邊都爲true結果是true。否則就是false。
& 和 &&區別:
& :無論左邊結果是什麼,右邊都參與運算。
&&:短路與,如果左邊爲false,那麼右邊不參數與運算。
| : 只要兩邊都爲false的時候結果纔是false,否則就是true
| 和|| 區別:
|:兩邊都參加運算。
||:短路或,如果左邊爲true,那麼右邊不參與運算。
流程控制語句
用於決定某個代碼塊是否可以被執行
if
switch
當判斷固定個數的值的時候建議使用switch,效率相對較高。
需要循環執行某個代碼塊的時候
do while
while
for
foreach
while和for可以相互轉換,如果需要定義變量控制循環次數,建議使用for,for循環完畢的時候變量會在內存中釋放。
java還提供了兩個關鍵字來幫助細粒化控制流程。
break:作用於switch和循環語句,用於跳出當前循環。
在break關鍵字下面的代碼不會被執行,當有嵌套的時候break只會跳出當前循環,如果需要跳出外部循環,可以給循環打個標記。
continue:作用於循環結構,含義是結束本次循環,開始下次循環。
數組
存儲同一類型並且固定長度數據的容器,通過對容器元素編號的方式來訪問元素,這樣的容器就是數組。
dataType[] arrayRefVar = {value0, value1, ..., valuek};
方法
爲了提高代碼的複用,可以將一個代碼塊抽取出一個方法,用於實現某一個或多個功能。
訪問修飾符 返回值類型 方法名稱(參數類型 形式參數0,參數類型 形式參數1,......){
執行語句;
return 返回值;
}
- return的作用是結束方法。
- 如果方法的返回值是void,系統會自動幫你補上。
- 當方法沒有具體的返回值時,返回值類型用void關鍵字表示。
- 形式參數對應着實際參數,前者的作用是佔位,後者是當調用方法的時候傳入的參數,這個參數是某個具體的值,因此稱爲實參。
- 參數的類型用於區分方法重載,方法重載指的是方法名相同參數列表不同,和返回值類型無關。
this
this是java中的關鍵字,你可以用它來
- 調用本類中的屬性,也就是類中的成員變量
- 調用本類中的其他方法
- 調用本類中的其他構造方法
在使用this關鍵字調用構造方法的時候需要放在構造方法的第一行,否則就會報錯,因爲構造方法用於初始化,初始化的動作需要一定被執行。
super
super 用於限定本類調用從父類繼承得到的實例變量或方法。
- 子類覆蓋父類屬性的時候可以使用super調用父類屬性
- 子類覆蓋父類方法的時候可以使用super調用父類方法
- 調用父類的構造方法,必須在首行調用
final
final用於修飾類、方法和變量,被final修飾有如下特點
- 被final修飾的類不可以被繼承,其中類中的成員變量都會隱式設置爲final,String就是這樣一個類。
- 被final修飾的方法不可以被覆蓋,被private修飾的方法會隱式地被指定爲final方法。
- 被final修飾的變量是一個常量,只能被賦值一次。
- 匿名內部類中使用的外部局部變量只能是final變量。
static
static是一個用於修飾成員變量和方法的修飾符,被static修飾之後有如下特點
- 對象數據共享
- 成員變量可以被類名直接調用
- 靜態優先於對象加載
static作用於成員變量時表示只保存一份副本,而final的作用是用來保證變量不可變。
使用static需要注意的地方
- 主函數是被靜態修飾
- 靜態優先對象加載,所以靜態方法只能訪問靜態成員變量,不能訪問非靜態成員變量
- this和super關鍵字也不能在靜態中使用,理由同上
- 被靜態修飾成員變量和方法會存儲到單獨的靜態區也就是方法區,否則會當作對象的一部分存儲在對象區也就是堆區
- 成員變量只能被對象調用而靜態變量可以被對象和類名調用
這是面試中常常遇到的問題,如果靜態代碼塊、構造函數、構造代碼塊同時存在,那麼它們先後執行的順序是:
靜態代碼塊-->構造代碼塊-->構造函數
abstract
abstract類用於標註一個類是抽象類,目的是不讓類實例化,抽象類有如下特點
- 抽象方法只能定義在抽象類中,並且只能修飾方法和類不能修飾變量。
- 抽象方法不負責具體的實現
- 抽象類不可以被實例化
- 當子類通過繼承的方式實現了抽象類中的所有抽象方法時,子類纔可以實例化,否則該子類也是一個抽象類
- 抽象類有構造方法,是用來給子類對象初始化的
- abstract不可以和final、private和static共存
抽象類的最佳實踐是模板設計模式
interface
interface用於修飾一個類爲接口,接口用於設計上的好處是
- 功能擴展
- 降低耦合
- 規則約束
- 多繼承
接口和抽象的區別
- 抽象類單繼承,接口多實現
- 抽象類可以定義非抽象方法,子類繼承使用;接口全是抽象方法需要子類實現
- 抽象類可以使用任意修飾符修飾,接口的成員都是public
instanceof
instanceof用於判斷一個對象是否是指定的類型
內部類
爲了方便訪問,直接將B類定義在A類中,那麼B類就是A類的內部類。A類可以通過創建B類對象訪問B類屬性,B類可以直接訪問A類屬性。如果內部類只需要被使用一次,那麼可以定義爲匿名類,就是沒有命名的內部類,定義匿名內部類的前提是必須繼承一個類或者實現一個接口。
異常
java中的異常可以分爲運行時異常和編譯時異常。在程序運行的時候產生的異常就是運行時異常。
異常被定義在java.lang.Throwable中。處理異常有兩種方式,拋出和捕獲。
拋出,使用throws關鍵字拋出異常,子類拋出的異常由父類處理,如果父類無法處理則可以繼續往上拋
捕獲,當一段代碼可能會發生異常的時候或已經發生異常的時候可以使用try/catch處理。
try {
需要被檢測的代碼;
}
catch(異常類 變量名){
異常處理代碼;
}
fianlly{
一定會執行的代碼;
}
java提供了很豐富的異常子類,另外開發者還可以自定義異常類豐富異常。