一、簡史
Java 誕生于 SUN (Stanford University Network) Microsystems Inc. Sun 公司從1995 年 Java 語言誕生,1996年發布 JDK 1.0 版本,隨后又發布了 JDK1.1, JDK1.2,JDK1.3, JDK1.4, JDK5.0,JDK6 等幾個版本, 2009 年4 月被Oracle 收購, 從此 java 納入了 Oracle 旗下,也進入了 JDK7 時代 JDK---Java Development Kits 。
Java 技術體系架構
一種技術體系架構的誕生,源于他要解決現實生活中的某一類問題。Java 有三個技 術架構:
Java SE(Java Standard Edition)標準版
這個版本是 Java 平臺的核心, 它提供了非常豐富的 API 來開發一般個人計算機上的應用 程序,為開發普通桌面和商務應用程序提供的解決方案。
Java EE(Java Enterprise Edition)企業版
是基于 J2SE 基礎擴展的,增加了用于服務器開發的類庫。為開發企業環境下的應用程 序提供的一套解決方案 ,如金融領域,政府政務領域。
Java ME(Java Micro Edition)小型版 (K-Java)
是 J2SE的內伸,包含 J2SE的一部分核心類,也有自己的擴展類,增加了適合微小裝置的 類庫:javax.microedition.io.*等。是為開發電子消費產品和嵌入式設備提供的解決方案。該 技術體系主要應用于小型電子消費類產品,如手機中的應用程序等。
三個概念 JVM JRE JDK
JVM---Java Virtual Machine 在一臺計算機上由軟件或硬件模擬出來的計算機。
JAVA 在設計時就很注重移植和跨平臺性。比如:JAVA int 永遠都是 32 位。不像 c++可能是 16,32位,可能是根據編譯器廠商規定的變化。這樣話程序的移植就會非常麻煩。Java 針對不同的操作系統有不同的虛擬機。Java 虛擬機機 屏蔽了底層運行平臺的差別,實現了“一次編譯,隨處運行”。
JRE --- Java Runtime Environment = JVM + 運行時所用到的類庫
JDK --- Java Development Kits = 開發工具 + JRE
二、Java 開發環境搭建
1.在www.oracle.com官方網站Downloads->Java for Developers->Java SE Downloads->JDK
2.安裝JDK(Java SE Development Kit)開發工具軟件
3.安裝好后,在指定的安裝路徑下可以看到如下兩個文件夾
例如:
我的安裝路徑為其默認安裝路徑,為:C:\Program Files\Java,這個目錄下有兩個子目錄,分別是 jdk1.8.0_45 和 jre1.8.0_45
注意:
[1]JDK(Java Development Kit ) =JRE+開發工具集(例如javac編譯工具等)
[2]JRE(Java runtime environment)=JVM+java SE標準類庫
4.設置系統Path環境變量,讓javac等工具可以在任何目錄運行
設置方法如下:
[1]新建環境變量 JDK_TOOLS,其內容為C:\Program Files\Java\jdk1.8.0_45\bin
[2]在Path環境變量原有內容前面加上%JDK_TOOLS%;
注意:這里的%JDK_TOOLS%表示引用JDK_TOOLS變量內容
三、 HelloWord.java程序編寫、編譯、運行
[1]編寫:新建HelloWord.java文件,編寫內容如下
注意:這里面class后面的類名需要與文件名相同,否則編譯會報錯
[2]編譯:用cd命令切換到HelloWord.java所在的目錄,用javac編譯
如:javac HelloWord.java
編譯成功后生成對應的字節碼文件HelloWord.class
[3]運行:用java命令解釋字節碼文件即運行Java程序
如:java HelloWord
注意:生成的字節碼文件為HelloWord.class,這種寫法是錯誤的:java HelloWord.class, Java 會 根據傳遞的HelloWord在當前目錄下去尋找對應的HelloWord.class文件
四、Java數據類型
1.基本數據類型
(1)數值型
[1]整數類型 byte[占8bit] ,short[占16bit], int[占32bit], long[占64位]
[2]浮點類型 float[占32bit] , double[占64bit]
(2)字符型 char [占16bit 整個Unicode字符集]
(3)布爾類型 boolean [1bit true 或 false]
注意:
[1]float f = 9.9 這種寫法有問題,因為編譯器默認認為9.9是一個double類型,這樣會丟失精度報錯
正確的寫法:float f = 9.9f
[2]long b = 11111111111 這樣寫有問題,因為編譯器默認認為數字都是int類型,報錯為過大的整數
正確寫法:long b = 11111111111L
[3]boolean類型的變量結果只能是true或false,當輸出boolean類型變量時候,輸出的結果為true或false
[4]java中null表示什么都沒有
2.引用數據類型
(1)類 class
(2)接口 interface
(3)數組
五、 Java數據類型間轉換
[1] boolean類型不能強制轉換成任何其它數據類型
[2]自動類型轉換:容量小的類型自動轉換成容量大的數據類型 byte->short->int->long->float->double
即一個小數據類型的變量或數據可以直接賦值給大數據類型變量
注意:對于byte、short、int類型的變量在計算時自動轉換為int
編譯器給出的錯誤信息:
[3]強制類型轉換:容量大的類型轉換成容量小的數據類型時,要加上強制轉換符
long a = 100L (數字默認是int型,100L是告訴編譯器100是一個long類型數據)
int i = (int)a
這樣做可能造成精度降低或數據溢出,使用時要小心
上面的錯誤解決方案:
六、Java與C語言不同
1、與C語言不同,JAVA里沒有無符號(unsigned)整型。
JAVA的8種基本類型(boolean,byte,short,char,int,long,float,double)都是有符號的。
2、與C語言不同,JAVA里的char類型,占2個字節,專為存放Unicode字符所設計;
3、與C語言不同,JAVA里的boolean只能賦值為true或false,不能直接賦值0或1;
4、與C語言不同,JAVA里的long類型,不是占4字節,而是占8字節。
5、JAVA與C的不同之處,還有很多:
JAVA中沒有指針,其實引用就是指針,但不能進行加減,也沒有取值(*)和取地址(&)。
JAVA中有垃圾回收機制,不需要自己釋放空間;只管new,不需要delete。
JAVA中的基本類型所占內存寬度是固定的,而C里可能跟平臺相關。
JAVA中沒有預處理指令。(如C中的#define , #include , #ifdef等)。
JAVA中沒有GOTO,但可以break或continue到指定的標簽。
JAVA中沒有const關鍵字,而是用static final來定義常量。
JAVA中沒有全局變量,卻有靜態(static)變量。
JAVA中不支持struct和union的類型。
JAVA中不支持可變參數列表。
JAVA中沒有BitField的功能。
JAVA中沒有typedef的功能。
七、Java關鍵字
對比C語言,Java關鍵字要多很多。上表中紅顏色標示的關鍵字,為java中的保留關鍵字,保留即不能使用的意思。
我們也可以把關鍵字做一個分類:
這些關鍵字大家現在沒必要記住,后面我們在用到的時候,在一個個講解。
八、Java中常量和變量
(I)常量
(1)常量表示的是在程序中不能被修改的數據。
(2)聲明常量必須用final關鍵字。
(3)常量分為:整型,浮點型,字符型,布爾型,字符串型常量。
例如,語法:final <數據類型> variable = 值;
(II)變量
(1)變量與常量的相同點是在聲明之前都指定變量的數據類型,變量無final關鍵字聲明。
(2)聲明變量語法:<數據類型> variable;
(3)命名規則:與C語言類似。
注意:
在Java中定義一個常量用關鍵字"final",在C語言中用的是"const"。"final"意為終的,用它的修飾的變量只能賦一次值。也就是說
final修飾的變量在賦值后是不能修改的。
九、Java中的轉義字符與運算符
1.常用的轉義字符
2.運算符
可以看出,java中的運算符和C語言中我們學的運算符差不多,這里就不做過多講解了。
注意:
在字符串中,使用"+"運算符,表示連接兩個字符串。
運行結果如下:
helloword
hellowordok
helloword23
helloword5
注意:
在Java中任何類型與字符串相加都轉成字符串拼接,還要注意優先級哦!
十、Java中的控制語句
(1) if 語句
用法和C語言一樣,只有一個地方需要注意,如下:
(2)switch ....case .... 語句
用法和C語言一樣,只有一個地方需要注意,如下:
(3)for 語句
用法和C語言一樣,只有一個地方需要注意,如下:
(4) while與do...while語句
用法和C語言一樣,只有一個地方需要注意,如下:
(5)break 和 continue
用法和C語言一樣,不做過多講解。
十一、Java中的數組
1.數組的定義
在C語言中,我們定義數組的方式如下:
數據類型 數組名[數組元素的個數];
例如:
int a[ 3 ];
int b[ ];//這種定義由于沒有指定數組元素個數,在C語言中是不允許的。
而且我們知道,當一個數組定義好后,它的空間大小也就固定了,一般在棧上開辟空間。
那在Java中,如何定義數組呢?
(1)數據類型[] 數組名;
例如:
int[] a;
(2)數據類型 數組名[];
例如:
int a[];
以上兩種方法在 java中都可以用來定義數組,我們建議大家使用第一種。
注意:
(1)在java中定義數組時,不能指定數組長度。" int[3] a"這種寫法是錯誤的。
(2)數組的大小,需要在靜態初始化 或 用"new"關鍵字在堆區申請內存。
(3)在C語言中,數組名是一個地址常量不能修改,在Java中,數組名是一個引用類型變量,可以修改的。
個人認為,Java中的數據名實際上類似于C語言的指針變量,不過這個指針變量只用來保存數組空間的首地址,所以在Java中,他是用數組類型定義的。
2.數組初始化與空間開辟
(1)靜態初始化
數據類型[ ] 引用類型變量名 = {數據1,數據2,數據3,....};
例如:
int[] a = {1,2,3,4,5};
這種寫法和C語言類似,不同的是在C語言中,此時數組的空間一般是在棧中開辟,而在Java中,數組的空間一定是在堆區分配。
(2)動態初始化
數據類型[ ] 引用類型變量名;
引用類型變量名 = new 數據類型[數組元素個數];
此時數組中的每個成員值默認為0。
或
引用類型變量名 = new 數據類型[ ]{數據1,數據2,數據3....}; 此時數組中的每個成員值為指定的數據。
例如:
int[] a;
a = new int[3];
或
a = new int[ ] {1,2,3};
這種寫法是錯誤的,需要注意:
a = new int[3]{1,2,3};
注意:這里的"new"類似于C語言中的"malloc",不同的是在C語言中我們手動申請的內存,需要自己手動釋放。在Java中我們申請的
內存由Java內部的回收機制自動釋放。一般在這一塊內存沒有人引用的時候,釋放。
(3)理解java 中的數組名與數組的關系
總結:
數組引用變量(數組名)是存放在棧內存(stack)中,數組元素是存放在堆內存(heap)中。
3.數組元素個數與數組元素訪問
在C語言中,數組元素個數可以通過 sizeof(數組名) / 數組元素大小得到。在Java中是沒有sizeof這個關鍵字的,在Java中數組元素個數的獲得可以使用數組的屬性成員"length"獲取。
例如:
可以看出在Java中訪問數組元素與C語言中并無區別,但是在Java中,有一種更簡單的方法(For each循環,也叫增強型for循環)遍歷數組。
注意:
Java SE 5.0增加了一種功能很強的循環結構,可以用來依次處理數組中的每個元素(其他類型的元素集合亦可)而不必為指定數組下標值而分心。
這種增強的for循環格式如下:
for(數據類型 變量名 : 集合){
java語句。
}
集合必須是一個數組或一個實現了Iterable接口的類對象。有關Iterable接口的內容我們在后面再討論。
例如:
4. 數組間的拷貝
我們先來看一個例子:
雖然看似digits的數組長度看似由4變成3,其實只是numbers和digits指向同一個數組而已,而digits本身失去引用而變成垃圾,等待垃圾回收來回收(但其長度仍然為4),但其內部運行機制如下圖所示。
可以看出,上面的代碼并沒有真正意義上做到數組的拷貝。那如何實現數組的拷貝呢,我們有兩種方法:
第一種:自己寫代碼將A數組中的每個成員挨個賦值給B數組。
第二種:調用java中提供的函數完成拷貝—
4. 數組的排序
(1)自己用排序算法實現
(2)調用Java實現好的排序算法
十二、Java中的二維數組
Java中的二維數組可以看成是數組的數組,說白了就是二維數組中存放的是多個一維數組,二維數組中的每個元素都是一維數組的數組名。
1.二維數組的定義方式1
type[][] array(推薦) 或 type array[][] 或 type[] array[];
例如:
int array[][];
array = new int[3][4];//這個二維數組中有三個一維數組,每個一維數組有4個成員
array[0][1] //第0個數組中的第1個元素
array[1][2] //第1個數組中的第2個元素
array[2][2] //第2個數組中的第2個元素
注意:
array[0],array[1],array[2]是三個一維數組的數組名。
2.二維數組定義方式2
type[ ][ ] array(推薦) 或 type array[ ][ ] 或 type[ ] array[ ];
例如:
int array[ ][ ];
array = new int[3][ ];
請注意和c語言的不同,在c語言中,二維數組的行可以省略,但是列絕對是不能省略的,之所以這樣規定是因為在c語言中,二維數組的
每一行元素個數必須是相等的。
在Java中,二維數組的行不能被省略,但是列可以省略,在Java中,二維數組的每一行數組元素的個數可以不相等,即每行是可變的。
3.二維數組的定義方式3
type[][] array = {{數據1,數據2,...},{數據1,數據2,...},{數據1,數據2,...} ...};