Java 教程
- Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高級程序設(shè)計語言。
- Java 可運行于多個平臺,如 Windows, Mac OS 及其他多種 UNIX 版本的系統(tǒng)。
我的第一個 JAVA 程序
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
Java 簡介
Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向?qū)ο蟪绦蛟O(shè)計語言和 Java 平臺的總稱。由 James Gosling和同事們共同研發(fā),并在 1995 年正式推出。
后來 Sun 公司被 Oracle (甲骨文)公司收購,Java 也隨之成為 Oracle 公司的產(chǎn)品。
Java分為三個體系:
- JavaSE(J2SE)(Java2 Platform Standard Edition,java平臺標準版)
- JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java平臺企業(yè)版)
- JavaME(J2ME)(Java 2 Platform Micro Edition,java平臺微型版)。
2005 年 6 月,JavaOne 大會召開,SUN 公司公開 Java SE 6。此時,Java 的各種版本已經(jīng)更名,以取消其中的數(shù)字 "2":J2EE 更名為 Java EE,J2SE 更名為Java SE,J2ME 更名為 Java ME。
主要特性
Java 語言是簡單的:
Java 語言的語法與 C 語言和 C++ 語言很接近,使得大多數(shù)程序員很容易學(xué)習(xí)和使用。另一方面,Java 丟棄了 C++ 中很少使用的、很難理解的、令人迷惑的那些特性,如操作符重載、多繼承、自動的強制類型轉(zhuǎn)換。特別地,Java 語言不使用指針,而是引用。并提供了自動分配和回收內(nèi)存空間,使得程序員不必為內(nèi)存管理而擔(dān)憂。Java 語言是面向?qū)ο蟮模?br> Java 語言提供類、接口和繼承等面向?qū)ο蟮奶匦裕瑸榱撕唵纹鹨?,只支持類之間的單繼承,但支持接口之間的多繼承,并支持類與接口之間的實現(xiàn)機制(關(guān)鍵字為 implements)。Java 語言全面支持動態(tài)綁定,而 C++語言只對虛函數(shù)使用動態(tài)綁定??傊?,Java語言是一個純的面向?qū)ο蟪绦蛟O(shè)計語言。
Java語言是分布式的:
Java 語言支持 Internet 應(yīng)用的開發(fā),在基本的 Java 應(yīng)用編程接口中有一個網(wǎng)絡(luò)應(yīng)用編程接口(java net),它提供了用于網(wǎng)絡(luò)應(yīng)用編程的類庫,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(遠程方法激活)機制也是開發(fā)分布式應(yīng)用的重要手段。Java 語言是健壯的:
Java 的強類型機制、異常處理、垃圾的自動收集等是 Java 程序健壯性的重要保證。對指針的丟棄是 Java 的明智選擇。Java 的安全檢查機制使得 Java 更具健壯性。Java語言是安全的:
Java通常被用在網(wǎng)絡(luò)環(huán)境中,為此,Java 提供了一個安全機制以防惡意代碼的攻擊。除了Java 語言具有的許多安全特性以外,Java 對通過網(wǎng)絡(luò)下載的類具有一個安全防范機制(類 ClassLoader),如分配不同的名字空間以防替代本地的同名類、字節(jié)代碼檢查,并提供安全管理機制(類 SecurityManager)讓 Java 應(yīng)用設(shè)置安全哨兵。Java 語言是體系結(jié)構(gòu)中立的:
Java 程序(后綴為 java 的文件)在 Java 平臺上被編譯為體系結(jié)構(gòu)中立的字節(jié)碼格式(后綴為 class 的文件),然后可以在實現(xiàn)這個 Java 平臺的任何系統(tǒng)中運行。這種途徑適合于異構(gòu)的網(wǎng)絡(luò)環(huán)境和軟件的分發(fā)。Java 語言是可移植的:
這種可移植性來源于體系結(jié)構(gòu)中立性,另外,Java 還嚴格規(guī)定了各個基本數(shù)據(jù)類型的長度。Java 系統(tǒng)本身也具有很強的可移植性,Java 編譯器是用 Java 實現(xiàn)的,Java 的運行環(huán)境是用 ANSI C 實現(xiàn)的。Java 語言是解釋型的:
如前所述,Java 程序在 Java 平臺上被編譯為字節(jié)碼格式,然后可以在實現(xiàn)這個 Java 平臺的任何系統(tǒng)中運行。在運行時,Java 平臺中的 Java 解釋器對這些字節(jié)碼進行解釋執(zhí)行,執(zhí)行過程中需要的類在聯(lián)接階段被載入到運行環(huán)境中。Java 是高性能的:
與那些解釋型的高級腳本語言相比,Java 的確是高性能的。事實上,Java 的運行速度隨著 JIT(Just-In-Time)編譯器技術(shù)的發(fā)展越來越接近于 C++。Java 語言是多線程的:
在 Java 語言中,線程是一種特殊的對象,它必須由 Thread 類或其子(孫)類來創(chuàng)建。通常有兩種方法來創(chuàng)建線程:其一,使用型構(gòu)為 Thread(Runnable) 的構(gòu)造子類將一個實現(xiàn)了 Runnable 接口的對象包裝成一個線程,其二,從 Thread 類派生出子類并重寫 run 方法,使用該子類創(chuàng)建的對象即為線程。值得注意的是 Thread 類已經(jīng)實現(xiàn)了 Runnable 接口,因此,任何一個線程均有它的 run 方法,而 run 方法中包含了線程所要運行的代碼。線程的活動由一組方法來控制。Java 語言支持多個線程的同時執(zhí)行,并提供多線程之間的同步機制(關(guān)鍵字為 synchronized)。Java 語言是動態(tài)的:
Java 語言的設(shè)計目標之一是適應(yīng)于動態(tài)變化的環(huán)境。Java 程序需要的類能夠動態(tài)地被載入到運行環(huán)境,也可以通過網(wǎng)絡(luò)來載入所需要的類。這也有利于軟件的升級。另外,Java 中的類有一個運行時刻的表示,能進行運行時刻的類型檢查。
Java 開發(fā)工具
Java 語言盡量保證系統(tǒng)內(nèi)存在 1G 以上,其他工具如下所示:
- Linux 系統(tǒng)、Mac OS 系統(tǒng)、Windows 95/98/2000/XP,WIN 7/8系統(tǒng)。
- Java JDK 7、8……
- vscode 編輯器或者其他編輯器。
- IDE:Eclipse、 IntelliJ IDEA、NetBeans 等。
Java 開發(fā)環(huán)境配置
搭建Java開發(fā)環(huán)境
Java 基礎(chǔ)語法
一個 Java 程序可以認為是一系列對象的集合,而這些對象通過調(diào)用彼此的方法來協(xié)同工作。下面簡要介紹下類、對象、方法和實例變量的概念。
- 對象:對象是類的一個實例,有狀態(tài)和行為。例如,一條狗是一個對象,它的狀態(tài)有:顏色、名字、品種;行為有:搖尾巴、叫、吃等。
- 類:類是一個模板,它描述一類對象的行為和狀態(tài)。
- 方法:方法就是行為,一個類可以有很多方法。邏輯運算、數(shù)據(jù)修改以及所有動作都是在方法中完成的。
- 實例變量:每個對象都有獨特的實例變量,對象的狀態(tài)由這些實例變量的值決定。
基本語法
編寫 Java 程序時,應(yīng)注意以下幾點:
- 大小寫敏感:Java 是大小寫敏感的,這就意味著標識符 Hello 與 hello 是不同的。
- 類名:對于所有的類來說,類名的首字母應(yīng)該大寫。如果類名由若干單詞組成,那么每個單詞的首字母應(yīng)該大寫,例如 MyFirstJavaClass 。
- 方法名:所有的方法名都應(yīng)該以小寫字母開頭。如果方法名含有若干單詞,則后面的每個單詞首字母大寫。
- 源文件名:源文件名必須和類名相同。當(dāng)保存文件的時候,你應(yīng)該使用類名作為文件名保存(切記 Java 是大小寫敏感的),文件名的后綴為 .java。(如果文件名和類名不相同則會導(dǎo)致編譯錯誤)。
- 主方法入口:所有的 Java 程序由 public static void main(String[] args) 方法開始執(zhí)行。
Java 標識符
Java 所有的組成部分都需要名字。類名、變量名以及方法名都被稱為標識符。
關(guān)于 Java 標識符,有以下幾點需要注意:
- 所有的標識符都應(yīng)該以字母(A-Z 或者 a-z),美元符($)、或者下劃線(_)開始
- 首字符之后可以是字母(A-Z 或者 a-z),美元符($)、下劃線(_)或數(shù)字的任何字符組合
- 關(guān)鍵字不能用作標識符
- 標識符是大小寫敏感的
- 合法標識符舉例:age、$salary、_value、__1_value
- 非法標識符舉例:123abc、-salary
Java修飾符
像其他語言一樣,Java可以使用修飾符來修飾類中方法和屬性。主要有兩類修飾符:
- 訪問控制修飾符 : default, public , protected, private
- 非訪問控制修飾符 : final, abstract, static, synchronized
Java 變量
Java 中主要有如下幾種類型的變量
- 局部變量
- 類變量(靜態(tài)變量)
- 成員變量(非靜態(tài)變量)
Java 數(shù)組
數(shù)組是儲存在堆上的對象,可以保存多個同類型變量。
Java 枚舉
Java 5.0引入了枚舉,枚舉限制變量只能是預(yù)先設(shè)定好的值。使用枚舉可以減少代碼中的 bug。
例如,我們?yōu)楣暝O(shè)計一個程序,它將限制果汁為小杯、中杯、大杯。這就意味著它不允許顧客點除了這三種尺寸外的果汁。
實例
class FreshJuice {
enum FreshJuiceSize{ SMALL, MEDIUM , LARGE }
FreshJuiceSize size;
}
public class FreshJuiceTest {
public static void main(String[] args){
FreshJuice juice = new FreshJuice();
juice.size = FreshJuice.FreshJuiceSize.MEDIUM ;
}
}
注意:枚舉可以單獨聲明或者聲明在類里面。方法、變量、構(gòu)造函數(shù)也可以在枚舉中定義。
Java 關(guān)鍵字
下面列出了 Java 關(guān)鍵字。這些保留字不能用于常量、變量、和任何標識符的名稱。
| 類別 | 關(guān)鍵字 | 說明 |
|---|---|---|
| 訪問控制 | private | 私有的 |
| 訪問控制 | protected | 受保護的 |
| 訪問控制 | public | 公共的 |
| 訪問控制 | default | 默認 |
| 類、方法和變量修飾符 | abstract | 聲明抽象 |
| 類、方法和變量修飾符 | class | 類 |
| 類、方法和變量修飾符 | extends | 擴充,繼承 |
| 類、方法和變量修飾符 | final | 最終值,不可改變的 |
| 類、方法和變量修飾符 | implements | 實現(xiàn)(接口) |
| 類、方法和變量修飾符 | interface | 接口 |
| 類、方法和變量修飾符 | native | 本地,原生方法(非 Java 實現(xiàn)) |
| 類、方法和變量修飾符 | new | 新,創(chuàng)建 |
| 類、方法和變量修飾符 | static | 靜態(tài) |
| 類、方法和變量修飾符 | strictfp | 嚴格,精準 |
| 類、方法和變量修飾符 | synchronized | 線程,同步 |
| 類、方法和變量修飾符 | transient | 短暫 |
| 類、方法和變量修飾符 | volatile | 易失 |
注意:Java 的 null 不是關(guān)鍵字,類似于 true 和 false,它是一個字面常量,不允許作為標識符使用。
繼承
在 Java 中,一個類可以由其他類派生。如果你要創(chuàng)建一個類,而且已經(jīng)存在一個類具有你所需要的屬性或方法,那么你可以將新創(chuàng)建的類繼承該類。
利用繼承的方法,可以重用已存在類的方法和屬性,而不用重寫這些代碼。被繼承的類稱為超類(super class),派生類稱為子類(subclass)。
接口
在 Java 中,接口可理解為對象間相互通信的協(xié)議。接口在繼承中扮演著很重要的角色。
接口只定義派生要用到的方法,但是方法的具體實現(xiàn)完全取決于派生類。
Java 對象和類
Java作為一種面向?qū)ο笳Z言。支持以下基本概念:
多態(tài)
繼承
封裝
抽象
類
對象
實例
方法
重載
- 對象:對象是類的一個實例,有狀態(tài)和行為。例如,一條狗是一個對象,它的狀態(tài)有:顏色、名字、品種;行為有:搖尾巴、叫、吃等。
- 類:類是一個模板,它描述一類對象的行為和狀態(tài)。
男孩(boy)、女孩(girl)為類(class),而具體的每個人為該類的對象(object)。
汽車為類(class),而具體的每輛車為該汽車類的對象(object),對象包含了汽車的顏色、品牌、名稱等。
Java中的對象
現(xiàn)在讓我們深入了解什么是對象??纯粗車鎸嵉氖澜?,會發(fā)現(xiàn)身邊有很多對象,車,狗,人等等。所有這些對象都有自己的狀態(tài)和行為。
拿一條狗來舉例,它的狀態(tài)有:名字、品種、顏色,行為有:叫、搖尾巴和跑。
對比現(xiàn)實對象和軟件對象,它們之間十分相似。
軟件對象也有狀態(tài)和行為。軟件對象的狀態(tài)就是屬性,行為通過方法體現(xiàn)。
在軟件開發(fā)中,方法操作對象內(nèi)部狀態(tài)的改變,對象的相互調(diào)用也是通過方法來完成。
Java 中的類
類可以看成是創(chuàng)建 Java 對象的模板。

通過上圖創(chuàng)建一個簡單的類來理解下 Java 中類的定義:
public class Dog {
String breed;
int size;
String colour;
int age;
void eat() {
}
void run() {
}
void sleep(){
}
void name(){
}
}
一個類可以包含以下類型變量:
局部變量:在方法、構(gòu)造方法或者語句塊中定義的變量被稱為局部變量。變量聲明和初始化都是在方法中,方法結(jié)束后,變量就會自動銷毀。
成員變量:成員變量是定義在類中,方法體之外的變量。這種變量在創(chuàng)建對象的時候?qū)嵗?。成員變量可以被類中方法、構(gòu)造方法和特定類的語句塊訪問。
類變量:類變量也聲明在類中,方法體之外,但必須聲明為 static 類型。
構(gòu)造方法
每個類都有構(gòu)造方法。如果沒有顯式地為類定義構(gòu)造方法,Java 編譯器將會為該類提供一個默認構(gòu)造方法。
在創(chuàng)建一個對象的時候,至少要調(diào)用一個構(gòu)造方法。構(gòu)造方法的名稱必須與類同名,一個類可以有多個構(gòu)造方法。
下面是一個構(gòu)造方法示例:
public class Puppy{
public Puppy(){
}
public Puppy(String name){
// 這個構(gòu)造器僅有一個參數(shù):name
}
}
創(chuàng)建對象
對象是根據(jù)類創(chuàng)建的。在Java中,使用關(guān)鍵字 new 來創(chuàng)建一個新的對象。創(chuàng)建對象需要以下三步:
聲明:聲明一個對象,包括對象名稱和對象類型。
實例化:使用關(guān)鍵字 new 來創(chuàng)建一個對象。
初始化:使用 new 創(chuàng)建對象時,會調(diào)用構(gòu)造方法初始化對象。
下面是一個創(chuàng)建對象的例子:
public class Puppy {
public Puppy(String name) {
// 這個構(gòu)造器僅有一個參數(shù):name
System.out.println("小狗的名字是 : " + name );
}
public static void main(String[] args) {
// 下面的語句將創(chuàng)建一個Puppy對象
Puppy myPuppy = new Puppy( "tommy" );
}
}
編譯并運行上面的程序,會打印出下面的結(jié)果:
小狗的名字是 : tommy
訪問實例變量和方法
通過已創(chuàng)建的對象來訪問成員變量和成員方法,如下所示:
/* 實例化對象 */
Object referenceVariable = new Constructor();
/* 訪問類中的變量 */
referenceVariable.variableName;
/* 訪問類中的方法 */
referenceVariable.methodName();
實例
下面的例子展示如何訪問實例變量和調(diào)用成員方法:
public class Puppy {
int puppyAge;
public Puppy(String name) {
// 這個構(gòu)造器僅有一個參數(shù):name
System.out.println("小狗的名字是 : " + name );
}
public void setAge( int age ) {
puppyAge = age;
}
public int getAge( ) {
System.out.println("小狗的年齡為 : " + puppyAge );
return puppyAge;
}
public static void main(String[] args) {
/* 創(chuàng)建對象 */
Puppy myPuppy = new Puppy( "tommy" );
/* 通過方法來設(shè)定age */
myPuppy.setAge( 2 );
/* 調(diào)用另一個方法獲取age */
myPuppy.getAge( );
/*你也可以像下面這樣訪問成員變量 */
System.out.println("變量值 : " + myPuppy.puppyAge );
}
}
編譯并運行上面的程序,產(chǎn)生如下結(jié)果:
小狗的名字是 : tommy
小狗的年齡為 : 2
變量值 : 2
源文件聲明規(guī)則
源文件的聲明規(guī)則。當(dāng)在一個源文件中定義多個類,并且還有import語句和package語句時,要特別注意這些規(guī)則。
- 一個源文件中只能有一個 public 類
- 一個源文件可以有多個非 public 類
- 源文件的名稱應(yīng)該和 public 類的類名保持一致。例如:源文件中 public 類的類名是 Employee,那么源文件應(yīng)該命名為Employee.java。
- 如果一個類定義在某個包中,那么 package 語句應(yīng)該在源文件的首行。
- 如果源文件包含 import 語句,那么應(yīng)該放在 package 語句和類定義之間。如果沒有 package 語句,那么 import 語句應(yīng)該在源文件中最前面。
- import 語句和 package 語句對源文件中定義的所有類都有效。在同一源文件中,不能給不同的類不同的包聲明。
類有若干種訪問級別,并且類也分不同的類型:抽象類和 final 類等。
除了上面提到的幾種類型,Java 還有一些特殊的類,如:內(nèi)部類、匿名類。
Java 包
包主要用來對類和接口進行分類。當(dāng)開發(fā) Java 程序時,可能編寫成百上千的類,因此很有必要對類和接口進行分類。
import 語句
在 Java 中,如果給出一個完整的限定名,包括包名、類名,那么 Java 編譯器就可以很容易地定位到源代碼或者類。import 語句就是用來提供一個合理的路徑,使得編譯器可以找到某個類。
例如,下面的命令行將會命令編譯器載入 java_installation/java/io 路徑下的所有類
import java.io.*;
一個簡單的例子
在該例子中,我們創(chuàng)建兩個類:Employee 和 EmployeeTest。
Employee 類有四個成員變量:name、age、designation 和 salary。該類顯式聲明了一個構(gòu)造方法,該方法只有一個參數(shù)。
Employee.java 文件代碼:
import java.io.*;
public class Employee {
String name;
int age;
String designation;
double salary;
// Employee 類的構(gòu)造器
public Employee(String name) {
this.name = name;
}
// 設(shè)置age的值
public void empAge(int empAge) {
age = empAge;
}
/* 設(shè)置designation的值*/
public void empDesignation(String empDesig) {
designation = empDesig;
}
/* 設(shè)置salary的值*/
public void empSalary(double empSalary) {
salary = empSalary;
}
/* 打印信息 */
public void printEmployee() {
System.out.println("名字:"+ name );
System.out.println("年齡:" + age );
System.out.println("職位:" + designation );
System.out.println("薪水:" + salary);
}
}
程序都是從main方法開始執(zhí)行。為了能運行這個程序,必須包含main方法并且創(chuàng)建一個實例對象。
下面給出EmployeeTest類,該類實例化2個 Employee 類的實例,并調(diào)用方法設(shè)置變量的值。
將下面的代碼保存在 EmployeeTest.java文件中。
EmployeeTest.java 文件代碼:
import java.io.*;
public class EmployeeTest {
public static void main(String[] args) {
/* 使用構(gòu)造器創(chuàng)建兩個對象 */
Employee empOne = new Employee("RUNOOB1");
Employee empTwo = new Employee("RUNOOB2");
// 調(diào)用這兩個對象的成員方法
empOne.empAge(26);
empOne.empDesignation("高級程序員");
empOne.empSalary(1000);
empOne.printEmployee();
empTwo.empAge(21);
empTwo.empDesignation("菜鳥程序員");
empTwo.empSalary(500);
empTwo.printEmployee();
}
}
編譯這兩個文件并且運行 EmployeeTest 類,可以看到如下結(jié)果:
名字:RUNOOB1
年齡:26
職位:高級程序員
薪水:1000.0
名字:RUNOOB2
年齡:21
職位:菜鳥程序員
薪水:500.0