
---
# Java入門系列(一)
## 主要內(nèi)容
* 基礎語法
* 基本數(shù)據(jù)類型
* 修飾符
## 基礎語法
第一個例子
```java
public class HelloWorld {
/* 第一個Java程序
* 它將打印字符串 Hello World
*/
public static void main(String []args) {
System.out.println("Hello World"); // 打印 Hello World
}
}
```
### 基本語法
- 大小寫敏感:Java是大小寫敏感的劣针,這就意味著標識符Hello與hello是不同的仆百。
- 類名:對于所有的類來說再膳,類名的首字母應該大寫。如果類名由若干單詞組成撮奏,那么每個單詞的首字母應該大寫,例如 MyFirstJavaClass 被饿。
- 方法名:所有的方法名都應該以小寫字母開頭医咨。如果方法名含有若干單詞,則后面的每個單詞首字母大寫灰追。
源文件名:源文件名必須和類名相同堵幽。當保存文件的時候,你應該使用類名作為文件名保存(切記Java是大小寫敏感的)弹澎,文件名的后綴為.java朴下。(如果文件名和類名不相同則會導致編譯錯誤)。
- 主方法入口:所有的Java 程序由public static void main(String []args)方法開始執(zhí)行苦蒿。
### 標識符
Java所有的組成部分都需要名字殴胧。類名、變量名以及方法名都被稱為標識符。
關于Java標識符团滥,有以下幾點需要注意:
- 所有的標識符都應該以字母(A-Z或者a-z),美元符($)竿屹、或者下劃線(_)開始
- 首字符之后可以是任何字符的組合
- 關鍵字不能用作標識符
- 標識符是大小寫敏感的
- 合法標識符舉例:age、$salary灸姊、_value拱燃、__1_value
- 非法標識符舉例:123abc、-salary
### 修飾符
像其他語言一樣力惯,Java可以使用修飾符來修飾類中方法和屬性碗誉。主要有兩類修飾符:
- 可訪問修飾符 : default, public , protected, private
- 不可訪問修飾符 : final, abstract, strictfp
### 變量
- 局部變量
- 類變量(靜態(tài)變量)
- 成員變量(非靜態(tài)變量)
### 枚舉
Java 5.0引入了枚舉,枚舉限制變量只能是預先設定好的值父晶。使用枚舉可以減少代碼中的bug诗充。
例如,我們?yōu)楣暝O計一個程序诱建,它將限制果汁為小杯、中杯碟绑、大杯俺猿。這就意味著它不允許顧客點除了這三種尺寸外的果汁。
```java
class FreshJuice {
enum FreshJuiceSize{ SMALL, MEDUIM, LARGE }
FreshJuiceSize size;
}
public class FreshJuiceTest {
public static void main(String []args){
FreshJuice juice = new FreshJuice();
juice.size = FreshJuice. FreshJuiceSize.MEDUIM ;
}
}
```
### 關鍵字
關鍵字 | 描述
---|---
abstract | 抽象方法格仲,抽象類的修飾符
assert | 斷言條件是否滿足
boolean | 布爾數(shù)據(jù)類型
break | 跳出循環(huán)或者label代碼段
byte | 8-bit 有符號數(shù)據(jù)類型
case | switch語句的一個條件
catch | 和try搭配撲捉異常信息
char | 16-bit Unicode字符數(shù)據(jù)類型
class | 定義類
const | 未使用
continue | 不執(zhí)行循環(huán)體剩余部分
default | switch語句中的默認分支
do | 循環(huán)語句押袍,循環(huán)體至少會執(zhí)行一次
double | 64-bit雙精度浮點數(shù)
else | if條件不成立時執(zhí)行的分支
enum | 枚舉類型
extends | 表示一個類是另一個類的子類
final | 表示一個值在初始化之后就不能再改變了,表示方法不能被重寫,或者一個類不能有子類
finally | 為了完成執(zhí)行的代碼而設計的凯肋,主要是為了程序的健壯性和完整性谊惭,無論有沒有異常發(fā)生都執(zhí)行代碼。
float | 32-bit單精度浮點數(shù)
for | for循環(huán)語句
goto | 未使用
if | 條件語句
implements | 表示一個類實現(xiàn)了接口
import | 導入類
instanceof | 測試一個對象是否是某個類的實例
int | 32位整型數(shù)
interface | 接口侮东,一種抽象的類型圈盔,僅有方法和常量的定義
long | 64位整型數(shù)
native | 表示方法用非java代碼實現(xiàn)
new | 分配新的類實例
package | 一系列相關類組成一個包
private | 表示私有字段,或者方法等悄雅,只能從類內(nèi)部訪問
protected | 表示字段只能通過類或者其子類訪問,子類或者在同一個包內(nèi)的其他類
public | 表示共有屬性或者方法
return | 方法返回值
short | 16位數(shù)字
static | 表示在類級別定義驱敲,所有實例共享的
strictfp | 浮點數(shù)比較使用嚴格的規(guī)則
super | 表示基類
switch | 選擇語句
synchronized | 表示同一時間只能由一個線程訪問的代碼塊
this | 表示調(diào)用當前實例或者調(diào)用另一個構造函數(shù)
throw | 拋出異常
throws | 定義方法可能拋出的異常
transient | 修飾不要序列化的字段
try | 表示代碼塊要做異常處理或者和finally配合表示是否拋出異常都執(zhí)行finally中的代碼
void | 標記方法不返回任何值
volatile | 標記字段可能會被多個線程同時訪問,而不做同步
while | while循環(huán)
## 基本數(shù)據(jù)類型
Java的兩大數(shù)據(jù)類型:
- 內(nèi)置數(shù)據(jù)類型
- 引用數(shù)據(jù)類型
### 內(nèi)置數(shù)據(jù)類型
Java語言提供了八種基本類型宽闲。六種數(shù)字類型(四個整數(shù)型众眨,兩個浮點型),一種字符類型容诬,還有一種布爾型娩梨。
#### byte:
- byte數(shù)據(jù)類型是8位、有符號的览徒,以二進制補碼表示的整數(shù)狈定;
- 最小值是-128(-2^7);
- 最大值是127(2^7-1)习蓬;
- 默認值是0掸冤;
- byte類型用在大型數(shù)組中節(jié)約空間厘托,主要代替整數(shù),因為byte變量占用的空間只有int類型的四分之一稿湿;
- 例子:byte a = 100铅匹,byte b = -50。
#### short:
- short數(shù)據(jù)類型是16位饺藤、有符號的以二進制補碼表示的整數(shù)
- 最小值是-32768(-2^15)包斑;
- 最大值是32767(2^15 - 1);
- Short數(shù)據(jù)類型也可以像byte那樣節(jié)省空間涕俗。一個short變量是int型變量所占空間的二分之一罗丰;
- 默認值是0;
- 例子:short s = 1000再姑,short r = -20000萌抵。
#### int:
- int數(shù)據(jù)類型是32位、有符號的以二進制補碼表示的整數(shù)元镀;
- 最小值是-2,147,483,648(-2^31)绍填;
- 最大值是2,147,483,647(2^31 - 1);
- 一般地整型變量默認為int類型栖疑;
- 默認值是0讨永;
- 例子:int a = 100000, int b = -200000。
#### long:
- long數(shù)據(jù)類型是64位遇革、有符號的以二進制補碼表示的整數(shù)卿闹;
- 最小值是-9,223,372,036,854,775,808(-2^63);
- 最大值是9,223,372,036,854,775,807(2^63 -1)萝快;
- 這種類型主要使用在需要比較大整數(shù)的系統(tǒng)上锻霎;
- 默認值是0L;
- 例子: long a = 100000L揪漩,Long b = -200000L量窘。
#### float:
- float數(shù)據(jù)類型是單精度、32位氢拥、符合IEEE 754標準的浮點數(shù)蚌铜;
- float在儲存大型浮點數(shù)組的時候可節(jié)省內(nèi)存空間;
- 默認值是0.0f嫩海;
- 浮點數(shù)不能用來表示精確的值冬殃,如貨幣;
- 例子:float f1 = 234.5f叁怪。
#### double:
- double數(shù)據(jù)類型是雙精度审葬、64位、符合IEEE 754標準的浮點數(shù);
- 浮點數(shù)的默認類型為double類型涣觉;
- double類型同樣不能表示精確的值痴荐,如貨幣;
- 默認值是0.0d官册;
- 例子:double d1 = 123.4生兆。
#### boolean:
- boolean數(shù)據(jù)類型表示一位的信息;
- 只有兩個取值:true和false膝宁;
- 這種類型只作為一種標志來記錄true/false情況鸦难;
- 默認值是false;
- 例子:boolean one = true员淫。
#### char:
- char類型是一個單一的16位Unicode字符合蔽;
- 最小值是’\u0000’(即為0);
- 最大值是’\uffff’(即為65,535)介返;
- char數(shù)據(jù)類型可以儲存任何字符拴事;
- 例子:char letter = ‘A’。
### 引用類型
- 在Java中圣蝎,引用類型的變量非常類似于C/C++的指針刃宵。引用類型指向一個對象,指向?qū)ο蟮淖兞渴且米兞客背埂_@些變量在聲明時被指定為一個特定的類型,比如Employee鞍陨、Pubby等步淹。變量一旦聲明后,類型就不能被改變了诚撵。
- 對象缭裆、數(shù)組都是引用數(shù)據(jù)類型。
- 所有引用類型的默認值都是null寿烟。
- 一個引用變量可以用來引用與任何與之兼容的類型消略。
- 例子:Site site = new Site("Runoob")嗡贺。
### Java常量
常量在程序運行時,不會被修改的量。
在 Java 中使用 final 關鍵字來修飾常量巫俺,聲明方式和變量類似:
```java
final double PI = 3.1415927;
```
雖然常量名也可以用小寫,但為了便于識別锄贼,通常使用大寫字母表示常量曲稼。
字面量可以賦給任何內(nèi)置類型的變量。例如:
```java
byte a = 68;
char a = 'A'
```
byte待锈、int漠其、long、和short都可以用十進制、16進制以及8進制的方式來表示和屎。
當使用常量的時候拴驮,前綴0?表示8進制,而前綴0x代表16進制柴信。例如:
```java
int decimal = 100;
int octal = 0144;
int hexa =? 0x64;
```
和其他語言一樣套啤,Java的字符串常量也是包含在兩個引號之間的字符序列。下面是字符串型字面量的例子:
```java
"Hello World"
"two\nlines"
"\"This is in quotes\""
```
字符串常量和字符常量都可以包含任何Unicode字符颠印。例如:
```java
char a = '\u0001';
String a = "\u0001";
```
Java語言支持一些特殊的轉(zhuǎn)義字符序列纲岭。
符號 | 字符含義
--- | ---
\n | 換行 (0x0a)
\r | 回車 (0x0d)
\f | 換頁符(0x0c)
\b | 退格 (0x08)
\s | 空格 (0x20)
\t | 制表符
\" | 雙引號
\' | 單引號
\\ | 反斜杠
\ddd | 八進制字符 (ddd)
\uxxxx | 16進制Unicode字符 (xxxx)
## 修飾符
Java語言提供了很多修飾符,主要分為以下兩類:
- 訪問修飾符
- 非訪問修飾符
-
修飾符用來定義類线罕、方法或者變量止潮,通常放在語句的最前端。我們通過下面的例子來說明:
```java
public class className {
// ...
}
private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;
public static void main(String[] arguments) {
// 方法體
}
```
### 訪問控制修飾符
Java中钞楼,可以使用訪問控制符來保護對類喇闸、變量、方法和構造方法的訪問询件。Java支持4種不同的訪問權限燃乍。
- 默認的,也稱為 default宛琅,在同一包內(nèi)可見刻蟹,不使用任何修飾符。
- 私有的嘿辟,以 private 修飾符指定舆瘪,在同一類內(nèi)可見。
- 共有的红伦,以 public 修飾符指定英古,對所有類可見。
- 受保護的昙读,以 protected 修飾符指定召调,對同一包內(nèi)的類和所有子類可見。
#### 訪問控制和繼承
請注意以下方法繼承的規(guī)則:
- 父類中聲明為public的方法在子類中也必須為public蛮浑。
- 父類中聲明為protected的方法在子類中要么聲明為protected唠叛,要么聲明為public。不能聲明為private沮稚。
- 父類中聲明為private的方法玻墅,不能夠被繼承。
### 非訪問修飾符
為了實現(xiàn)一些其他的功能壮虫,Java也提供了許多非訪問修飾符澳厢。
- static修飾符环础,用來創(chuàng)建類方法和類變量。
- Final修飾符剩拢,用來修飾類线得、方法和變量,final修飾的類不能夠被繼承徐伐,修飾的方法不能被繼承類重新定義贯钩,修飾的變量為常量,是不可修改的办素。
- Abstract修飾符角雷,用來創(chuàng)建抽象類和抽象方法。
- Synchronized和volatile修飾符性穿,主要用于線程的編程勺三。
#### Static修飾符
- 靜態(tài)變量:
Static關鍵字用來聲明獨立于對象的靜態(tài)變量,無論一個類實例化多少對象需曾,它的靜態(tài)變量只有一份拷貝吗坚。 靜態(tài)變量也被成為類變量。局部變量不能被聲明為static變量呆万。
- 靜態(tài)方法:
Static關鍵字用來聲明獨立于對象的靜態(tài)方法商源。靜態(tài)方法不能使用類的非靜態(tài)變量。靜態(tài)方法從參數(shù)列表得到數(shù)據(jù)谋减,然后計算這些數(shù)據(jù)牡彻。
#### Final修飾符
##### Final變量:
Final變量能被顯式地初始化并且只能初始化一次。被聲明為final的對象的引用不能指向不同的對象出爹。但是final對象里的數(shù)據(jù)可以被改變庄吼。也就是說final對象的引用不能改變,但是里面的值可以改變以政。
Final修飾符通常和static修飾符一起使用來創(chuàng)建類常量霸褒。
實例:
```java
public class Test{
final int value = 10;
// 下面是聲明常量的實例
public static final int BOXWIDTH = 6;
static final String TITLE = "Manager";
public void changeValue(){
value = 12; //將輸出一個錯誤
}
}
```
##### Final方法
類中的Final方法可以被子類繼承伴找,但是不能被子類修改盈蛮。
聲明final方法的主要目的是防止該方法的內(nèi)容被修改。
如下所示技矮,使用final修飾符聲明方法抖誉。
```java
public class Test{
public final void changeName(){
// 方法體
}
}
```
##### Final類
Final類不能被繼承,沒有類能夠繼承final類的任何特性衰倦。
實例:
```java
public final class Test {
// 類體
}
```
#### Abstract修飾符
##### 抽象類:
抽象類不能用來實例化對象袒炉,聲明抽象類的唯一目的是為了將來對該類進行擴充。
一個類不能同時被abstract和final修飾樊零。如果一個類包含抽象方法我磁,那么該類一定要聲明為抽象類孽文,否則將出現(xiàn)編譯錯誤。
抽象類可以包含抽象方法和非抽象方法夺艰。
實例:
```java
abstract class Caravan{
private double price;
private String model;
private String year;
public abstract void goFast(); //抽象方法
public abstract void changeColor();
}
```
##### 抽象方法
抽象方法是一種沒有任何實現(xiàn)的方法芋哭,該方法的的具體實現(xiàn)由子類提供。抽象方法不能被聲明成final和strict郁副。
任何繼承抽象類的子類必須實現(xiàn)父類的所有抽象方法减牺,除非該子類也是抽象類。
如果一個類包含若干個抽象方法存谎,那么該類必須聲明為抽象類拔疚。抽象類可以不包含抽象方法。
抽象方法的聲明以分號結(jié)尾既荚,例如:public abstract sample();
實例:
```java
public abstract class SuperClass{
abstract void m(); //抽象方法
}
class SubClass extends SuperClass{
//實現(xiàn)抽象方法
void m(){
.........
}
}
```
#### Synchronized修飾符
Synchronized關鍵字聲明的方法同一時間只能被一個線程訪問稚失。Synchronized修飾符可以應用于四個訪問修飾符。
實例:
```java
public synchronized void showDetails(){
.......
}
```
#### Transient修飾符
序列化的對象包含被transient修飾的實例變量時固以,java虛擬機(JVM)跳過該特定的變量墩虹。
該修飾符包含在定義變量的語句中,用來預處理類和變量的數(shù)據(jù)類型憨琳。
實例:
```java
public transient int limit = 55;? // will not persist
public int b; // will persist
```
#### Volatile修飾符
Volatile 修飾的成員變量在每次被線程訪問時诫钓,都強制從共享內(nèi)存中重新讀取該成員變量的值。而且篙螟,當成員變量發(fā)生變化時菌湃,會強制線程將變化值回寫到共享內(nèi)存。這樣在任何時刻遍略,兩個不同的線程總是看到某個成員變量的同一個值惧所。
一個volatile對象引用可能是null。
實例:
```java
public class MyRunnable implements Runnable
{
private volatile boolean active;
public void run()
{
active = true;
while (active) // 第一行
{
// 代碼
}
}
public void stop()
{
active = false; // 第二行
}
}
```
通常情況下绪杏,在一個線程調(diào)用 run() 方法(在 Runnable 開啟的線程)下愈,在另一個線程調(diào)用 stop() 方法。 如果 第一行 中緩沖區(qū)的 active 值被使用蕾久,那么在 第二行 的 active 值為 false 時循環(huán)不會停止势似。
但是以上代碼中我們使用了 volatile 修飾 active,所以該循環(huán)會停止僧著。