2018年10月31日 星期三

Java SE 入門教學 - 基礎語法

更新時間:10/31/2018

前言

Sun Microsystems(昇陽電腦)主要產品是工作站、伺服器和 UNIX 作業系統。1995年昇陽開發了 Java 技術,這是第一個通用軟體平台。1997年開發出 Java 2。其創始人為Bill JoyVinod KhoslaAndy BechtolsheimScott McNealy,昇陽這個名字來源於史丹福大學網路(Stanford University Network)的縮寫。

一、識別子

Java 對各種變量、方法和類別等要素命名時使用的字符序列稱為識別子。凡是自己可以起名字的地方都叫識別子,都遵守識別子的規則。

Java 識別子命名規則:

  • 識別子由字母、下底線(_)、錢記號($)或數字組成。
  • 識別子應以字母、下底線(_)、錢記號($)開頭。
  • Java 識別子大小寫敏感,長度無限制。

約定俗成:Java 識別子選取因注意「見名知意」且不能與 Java 語言的關鍵字重複名字。

合法的識別子 不合法的識別子
$bS5_c7 class
DataClass DataClass#
_987 98.3
HelloWorld Hello World

二、關鍵字

Java 中一些賦以特定的涵義,做為專門用途的字串稱為關鍵字(keyword)。大多數編輯器會將關鍵字用特殊方式標出。

所有 Java 關鍵字都是小寫英文。

goto 和 const 雖然從未使用,但也被 Java 做為關鍵字保留。

abstract default if private this
boolean do implements protected throw
break double import public throws
byte else instanceof return transient
case extends int short try
catch final interface static void
char finally long strictfp volatile
class float native super while
const for new switch null
continue goto package synchronized

三、JAVA 基礎數據類型

3.1 Java 常數

Java 的字串常數使用雙引號("")表示,字元常數使用單引號(''),邏輯常數與數字常數正常書寫。

  • 字串常數 "hello world"
  • 字元常數 'a'
  • 邏輯常數 true、false
  • 整數常數 123
  • 浮點數常數 3.14

注意:區分字串和字元常數。

注意:"常數"這個名詞還會用在另外其他語境中表示值不可變的變量。

3.2 Java 變數

Java 變數是程序中最基本的儲存單元,其要素包括變數名,變數類型和存取權限。

Java 程序中每一個變數都屬於特定的數據類型,在使用前必須對其聲明,聲明格式為:
 ◉ type varName[=value][{,varName2[=value2]}];

例如:

int i = 100;
float f = 12.3f;
double dl, d2, d3 = 0.123;
String s = "hello";
Stack
變數名
記憶體位置
i
100
0x22FF40
f
3.14
0x22FF44
d3
0.123
0x22FF48
s
0x3e2460
0x22FF50
Heap
常數池
hello
0x3e2460

從本質上來講,變量其實是內存裡面的一小塊區域,一個程序在運行的時候,實際上這個程序是位於內存裡面,然後才開始運行。

一個.exe文件存放在硬盤上是無法運行的,在硬盤上看到的.exe文件無非就是一個文件而已,當我們雙擊這個.exe文件時,運行起來的時候實際上是整個.exe文件被放在了在內存裡面,然後操作系統找到main方法,也就是程序的入口,然後就開始執行了。類型的,聲明成不同的數據類型,它就在內存裡面分配不同的存儲空間。

執行的過程之中,會不斷地在內存裡面分配一些區域,變量在內存裡面就是一小塊區域,變量有兩個概念,一個是變量的名字,另一個是變量的值,即這一小塊區域是有名字的,裡面裝著一個值,因此以後要想訪問這小塊區域裡面的內容就可以根據這小塊區域的名字來訪問了。

因此,變量的本質就是一小塊內存區域。就變量來說,該在內存裡面分配多大的存儲空間呢?不同的變量類型分配不同大小的存儲空間,每一個變量都是屬於特定的數據類型的,聲明成不同的數據類型,它就在內存裡面分配不同的存儲空間。

3.3 Java 數據類型劃分

基本型態(Primitive type):

數值型:

整數類型:byte、short、int、long。
浮點數類型:float、double。

字元:char。
布林:boolean。

類別型態(Class type):

類別:class。
介面:interface。
抽象類別:abstract。
列舉:enum。

四、Java 數據類型講解

4.1 boolean - 布林值

適用於邏輯運算,一般用於程序流程控制。只允許取值 true 或 false ,不可以使用 0 或 非0 的整數替代,這點和 C 語言不同。
用法舉例:

4.2 char - 字元

用單引號括起來的單個字元,例如:
 ◉ char eChar = 'a';
 ◉ char cChar = '中';

Java 字元採用 Unicode 編碼,每個字元佔兩個 Byte,因而可用十六進制編碼形式表示,例如:
 ◉ char c1 = '\u0061';
 ◉ 注:Unicode 是全球語言統一編碼。

Java 語言中還允許使用轉義字符'\'來將其後的字元轉變為其它的含義,例如:
 ◉ char c2 = '\n'; ('\n'代表換行字元)

補充:2進制、10進制、16進制之間的轉換
 ◉ 1101 — 1*1 + 0*2 + 1*4 + 1*8
 ◉ 13 — 1 + 4 + 8 — 1101
 ◉ 1101 — D

4.3 整數類型

Java 各整數類型有固定的數字範圍和記憶體使用量,其不受具體操作系統的影響,以保證 Java 程序的可移植性。

Java 語言整數常量的三種表示形式:
 ◉ 十進制整數,如:12, -314, 0。
 ◉ 八進制整數,要求以 0 開頭,如:012。
 ◉ 十六進制整數,要求 0x 或 0X 開頭,如:0x12。
 ◉ 二進制整數,要求以 0b 或 0B 開頭,如:0b101。

Java 語言的整數類型常數默認為 int ,聲明 long 常數可以在數字後加上 'l' 或 'L',如:
 ◉ int i1 = 600; //正確
 ◉ long l1 = 88888888888L; //必須加 L,否則會出錯

類 型 記憶體使用量 數字範圍
byte 1 byte -128 ~ 127
short 2 bytes -215 ~ 215-1
int 4 bytes -231 ~ 231-1
long 8 bytes -263 ~ 263-1

4.4 浮點類型

與整數類型類似,Java 浮點類型有固定的數字範圍與記憶體使用量,不受平台影響。

Java 浮點類型常數有兩種表示形式:
 ◉ 十進制數字形式,例如:3.14、314.0、0.314。
 ◉ 科學記號形式,例如:3.14e2、314E2、100E-2。

Java 浮點類型常數默認為 double 類型,如要聲明一個常數為 float,則需在數字後面加 f 或 F,如:  ◉ double d = 12345.6; //正確
 ◉ float f = 12.3f; //必須加f,否則會出錯

類 型 記憶體使用量 數字範圍
float 4 bytes -3.403E38 ~ 3.403E38
double 8 bytes -1.798E308 ~ 1.798E308

4.5 預設值

Data Type Default Value (for fields)
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char '\u0000'
String (or any object)   null
boolean false

五、運算符

寫程式時,總要弄懂所寫的與實際跑出來的結果是否相符,簡單的驗證方式就是輸出結果來看看。底下程式碼將展示不同格式輸出的結果。

  • 字串: ""
  • 字元: ''
  • Unicode: '\u0000' ~ '\uFFFF'
  • 十六進制: 0x
  • 八進制: 0
  • 二進位: 0b
  • 科學記號: e

System.out.print(); 輸出後不換行。

System.out.println(); 輸出後換行。



5.1 Java 語言支持如下運算符:

◉ 算數運算符:

  • 加:+
  • 減:-
  • 乘:*
  • 取商數:/
  • 取餘數:%
  • 自增量(increment):++
  • 自減量(decrement ):--

◉ 關係運算符:

  • 大於:>
  • 小於:<
  • 大於等於:>=
  • 小於等於:<=
  • 等於:==
  • 不等於:!=

◉ 位元運算符:

  • 非捷徑 且(and):&
  • 非捷徑 或(or):|
  • 異或(xor):^
  • 補數:~
  • 左移:<<
  • 右移:>>
  • 無符號右移:>>>

◉ 邏輯運算符:

  • 否定:!
  • 捷徑 且(and):&&
  • 捷徑 或(or):||

◉ 賦值運算符:=

◉ 擴展賦值運算符:&=、|=、^=、<<=、>>=、>>>=、+=、-=、*=、/=

◉ 字串連接運算符:+

5.2 字串連接

「+」號為字串連接的運算符,如果「+」號前後有字串,則 Java 會自動使用字串連結。底下程式碼會拋出例外。

編譯時(javac Test2.java)拋出例外:

Test2.java:4: error: bad operand types for binary operator '-'
                System.out.println("10-3=" + 10-3);
                                               ^
  first type:  String
  second type: int
1 error

錯誤代碼在第4行,我們把程式碼修正,如下所示。

雖然編譯成功,也可以執行,但您會發現 10+3=103 ?!,怎麼運算結果是錯的?!

因為 "10+3=" 是字串所以會以字串連接成 "10+3=10",又因為變成了字串,再串接就變成 "10+3=103"。所以如果這邊要先計算 10+3,那就必須用小括號先刮起來,請 Java 先做運算變成 13,再與前述 "10+3=" 字串連接,就會是正確的結果了!


5.3 算數運算符

◉ Java 的餘數運算在浮點數的運算下也可以成立。


◉ 自增量(++) 後綴與前綴

第13行 b+=a++; 為後綴自增量,結果 b 為30;a 為11,步驟如下

(1) b = b + a;
(2) b = 20 + 10
(3) b = 30
(4) a = a + 1;
(5) a = 10 + 1
(6) a = 11

第19行 c+=++a; 為前綴自增量,結果 c 為31;a 為11,步驟如下

(1) a = a + 1;
(2) a = 10 + 1
(3) a = 11
(4) c = c + a;
(5) c = 20 + 11
(6) c = 31

5.4 關係與邏輯運算符


5.5 位元運算符

當宣告一個整數時,Java會配置 32 bit 的記憶體來儲存,其中最左邊的一個 bit 是用來紀錄正負號,所以只剩下 31 bit 可用來表示數字。

◉ 8 & 9
0
00......000
1 0 0 0
0
00......000
1 0 0 1
&
0
00......000
1 0 0 0
◉ 8 | 9
0
00......000
1 0 0 0
0
00......000
1 0 0 1
|
0
00......000
1 0 0 1
◉ 8 ^ 9
0
00......000
1 0 0 0
0
00......000
1 0 0 1
^
0
00......000
0 0 0 1
◉ ~ 8
0
00......000
1 0 0 0
~
1
11......111
0 1 1 1
◉ ~ -9
1
11......111
0 1 1 1
~
0
00......000
1 0 0 0
◉ ~ 1
0
00......000
0 0 0 1
~
1
11......111
1 1 1 0
◉ ~ -2
1
11......111
1 1 1 0
~
0
00......000
0 0 0 1
◉ 8 << 2
0
00......0001000
<< 2
00......0001000
00
0
00......0100000
◉ 8 >> 2
0
00......0001000
>> 2
00
00......0001000
0
0000......00010
◉ -8 >>> 2
111......1111000
>>> 2
111......1111000
00
111......11110

電腦記憶體儲存正整數與負整數方式
以 8 bit 當例子。0 到 127 沒有什麼問題,就是一般的二進制算法;但負數方面是從 -128 開始到 -1,對照表如下:


5.5 賦值運算符

當"="兩側數據類型不一致時,可以適用默認類型轉換或使用強制類型轉換原則進行處理
 ◉ long lg = 100;
 ◉ int i = (int)lg;

注意:常數整數可以直接賦值給 byte、short、char 等類型變數,而不需要進行強制轉換,只要不超出其數值範圍。
 ◉ byte b = 12;
 ◉ char c = 100;
 ◉ byte bb = 256; (X) (超出 byte 的數值範圍)
 ◉ short s = -32769; (X) (超出 short 的數值範圍)

運算符 用法舉例 相等的表達示
+= a += b a = a + b
-= a -= b a = a - b
*= a *= b a = a * b
/= a /= b a = a / b
%= a %= b a = a % b
&= a &= b a = a & b
|= a |= b a = a | b
^= a ^= b a = a ^ b
<<= a <<= b a = a << b
>>= a >>= b a = a >> b
>>>= a >>>= b a = a >>> b

5.6 表達式

表達式是符合一定語法規則的運算符和操作數的序列。

表達式的運算順序應按照運算符的優先級從高到低的順序進行,優先級相同的運算符號按照事先約定的運算方向進行。

優先值 運算子 同等順序
1 .
()
{}
R to L
2 ++
--
~
!
L to R
3 *
/
%
L to R
4 +
-
L to R
5 <<
>>
>>>
L to R
6 <
>
<=
>=
instanceof
L to R
7 ==
!=
L to R
8 & L to R
9 ^ L to R
10 | L to R
11 && L to R
12 || L to R
13 ?: R to L
14 =
*=
/=
%=
+=
-=
<<=
>>=
>>>=
&=
^=
|=
R to L
優先值:1代表最高優先值,14代表最低優先值。
同等順序:指運算式遇到同等級優先值時的運算處理。

5.7 三元運算子

語法: x?y:z

x 為 boolean 類型表達式,先計算 x 的值,若為 true,則整個三元運算子的結果為表達式 y 的值,否則整個運算結果為表達式 z 的值。

例如:

六、總結

識別子命名變數時,JAVA 保留的關鍵字不能使用,遵照 JAVA 建議的命名規則取一個易懂的變數名字吧!

運算符號的操作有一定的規則,特別是「字串連接運算符」與「位元運算符」要特別注意。





沒有留言:

張貼留言