Java是完全物件導向的語言。 Java透過虛擬機器的運作機制,實現「跨平台」的概念。我在這裡想要呈現一個適合初學者的教程,希望對大家有用。
"Hello World!"
先來看一個HelloWorld.java程式。這個程式在螢幕上印出一串字元"Hello World!":
複製代碼代碼如下:
public class HelloWorld
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
程式中包括Java的一些基本特徵:
1.類別(class):上面程式定義了一個類別HelloWorld,該類別的名字與.java檔案的名字相同。
2.方法(method):類別的內部定義了該類別的一個方法main。
3.語句(statement):真正的「列印」功能由一個語句實現,即: System.out.println("Hello World!");
下面兩點有關Java的書寫方式:
1.Java中的語句要以;結尾(與C/C++相同)。
2.用花括號{}來整合語句,形成程式區塊。透過程式區塊,我們可以知道程式的不同部分的範圍,例如類別從哪裡開始,到哪裡結束。
編譯與執行
Java程式要經過編譯器編譯才能執行。在Linux或Mac下,可以下載安裝Java JDK。
使用javac來編譯。在命令列中輸入下面語句編譯:
複製代碼代碼如下:
$javac HelloWorld.java
在目前路徑下,將會有一個名為HelloWorld.class的檔案產生。
使用java命令來運行。 Java會搜尋該類別中的main方法,並執行。
複製代碼代碼如下:
$java HelloWorld
變數
電腦語言通常需要在記憶體中存放數據,例如C語言中的變量,Java也有類似的變數。 Java和C語言都是靜態型別的語言。在使用變數之前,要聲明變數的類型。
變數(variable)佔據一定的記憶體空間。不同類型的變數佔據不同的大小。 Java中的變數類型如下:
複製代碼代碼如下:
名稱儲存大小例值註釋
byte 1byte 3 位元組
int 4bytes 3 整數
short 2bytes 3 短整數
long 8bytes 3 長整數
float 4bytes 1.2 單精確度浮點數
double 8bytes 1.2 雙精確度浮點數
char 2bytes 'a' 字符
boolean 1bit true 布林值
在Java中,變數需要先宣告(declare)才能使用。在聲明中,我說明變數的類型,賦予變數以特別名字,以便在後面的程式中呼叫它。你可以在程式中的任意位置宣告變數。
比如:
複製代碼代碼如下:
public class Test
{
public static void main(String[] args)
{
System.out.println("Declare in the middle:");
int a;
a = 5;
System.out.println(a); // print an integer
}
}
上面a是變數名。可以在宣告變數的同時,給變數賦值,例如int a = 5;
*** 「變數」的概念其實來自於過程導向的程式語言。在Java中,所謂的變數其實是「基本型別」 (premitive type)。我們將在類的講解中更多深入。
上面的程式還可以看到,Java中,可用//引領註釋。
陣列
Java中有數組(array)。數組包含相同類型的多個資料。我用下面方法來宣告一個整數陣列:
複製代碼代碼如下:
int[] a;
在聲明數組時,數組所需的空間並沒有真正分配給數組。我可以在聲明的同時,用new來建立陣列所需空間:
複製代碼代碼如下:
int[] a = new int[100];
這裡創建了可以容納100個整數的陣列。對應的記憶體分配也完成了。
我還可以在聲明的同時,給數組賦值。數組的大小也同時確定。
複製代碼代碼如下:
int[] a = new int[] {1, 3, 5, 7, 9};
使用int[i]來呼叫數組的i下標元素。 i從0開始。
其他類型的數組與整數數組相似。
表達式
表達式是變數、常數和運算子的組合,它表示一個資料。 1 + 1是常見的表達式。再比如:
複製代碼代碼如下:
public class Test
{
public static void main(String[] args)
{
System.out.println("Declare in the middle:");
int a;
a = 5 + 1;
System.out.println(a); // print an integer
}
}
上面的5 + 1也是一個表達式,等於6。
數學表達式
數學運算,結果為一個數值複製程式碼如下:
1 + 2 加法
4 - 3.4 減法
7 * 1.5 乘法
3.5 / 7 除法
7 % 2 求餘數
關係表達式
判斷表達式是否成立。即一個boolean值,真假複製程式碼如下:
a > 4.2 大於
3.4 >= b 大於等於
1.5 < 9 小於
6 <= 1 小於等於
2 == 2 等於
2 != 2 不等於
布林表達式
兩個boolean值的與、或、非的邏輯關係複製程式碼如下:
true && false and
(3 > 1) || (2 == 1) or
!true not
位元運算
將整數的二進位形式逐位進行邏輯運算,得到一個整數複製碼碼如下:
& and
| or
^ xor
~ not
5 << 3 0b101 left shift 3 bits
6 >> 1 0b110 right shift 1 bit
還有下列在C中常見的運算符,我會在用到的時候進一步解釋:
複製代碼代碼如下:
m++ 變數m加1
n-- 變數n減1
condition ? x1 : x2 condition為一個boolean值。根據condition,取x1或x2的值
控制結構
Java中控制結構(control flow)的語法與C類似。它們都使用{}來表達隸屬關係。
選擇(if)
複製代碼代碼如下:
if (conditon1) {
statements;
…
}
else if (condition2) {
statements;
…
}
else {
statements;
…
}
上面的condition是一個表示真假值的表達式。 statements;是語句。
練習寫一個Java程序,判斷2013年是否為閏年。
循環(while)
複製代碼代碼如下:
while (condition) {
statements;
}
迴圈(do... while)
複製代碼代碼如下:
do {
statements;
} while(condition); // 注意結尾的;
循環(for)
複製代碼代碼如下:
for (initial; 條件; update) {
statements;
}
跳過或跳出循環
在循環中,可以使用複製代碼代碼如下:
break; // 跳出循環
continue; // 直接進入下一環
練習寫一個Java程序,計算從1加2,加3… 一直加到999的總和
選擇(switch)
複製代碼代碼如下:
switch(expression) {
case 1:
statements;
break;
case 2:
statements;
break;
…
default:
statements;
break;
}
物件導向
「物件」是電腦抽象世界的一種方式。 「物件導向」可以用很多方式表達。下面是一種並不精確,但比較直覺的理解方式:
1.世界上的每一個事物都可以稱為一個物件(object),例如張三。物件有身分(Identity),狀態(State)和行為(Behavior)。
2.物件的狀態由資料成員(data member)表示。資料成員又被稱作域(field)。我們用其他物件作為該對象的資料成員。例如一個表示身高的整數,例如一個鼻子。
3.物件的行為由成員方法(member method)表示。我們簡稱為方法(method)。一個物件可以有多種方法,例如呼吸,睡覺。
4.物件可以歸類(class),或者說歸為同一型別(type)。同一類型的物件有相同的方法,有同類型的資料成員。某個類型的一個物件被稱為該類型的一個實例(instance)。
類別與對象
定義類別的語法:
複製代碼代碼如下:
class ClassName
{
member1;
member2;
…
}
我們定義一個human類別:
複製代碼代碼如下:
class Human
{
void breath()
{
System.out.println("hu...hu...");
}
int height;
}
在{}範圍內,Human類別有兩個成員: 一個資料成員height,一個方法breath()。
1.資料成員height是整數類型,可以用來儲存一個整數。
2.方法代表了物件所能進行的動作,也就是電腦所能進行的操作。方法可以接受參數,並能傳回值。在breath()的定義中,breath後面的()中為參數列表。由於參數列表為空,所以breath()不接受參數。在breath()之前的void為傳回值的類型,表示breath不回傳值。
(方法與過程導向語言中的函數類似)
現在,我們建立物件aPerson,並呼叫物件的方法breath:
複製代碼代碼如下:
public class Test
{
public static void main(String[] args)
{
Human aPerson = new Human();
aPerson.breath();
System.out.println(aPerson.height);
}
}
class Human
{
void breath()
{
System.out.println("hu...hu...");
}
int height;
}
在main方法中,使用new關鍵字建立物件。即使是來自同一個類別的對象,各個對象佔據的記憶體也不相同,即對象的身份也不同。
Human aPerson聲明了aPerson物件屬於Human類,即說明了物件的類型。
物件建立後,我們可以用物件.資料成員來引用資料成員,使用物件.方法() 的方式來呼叫方法。正如我們在後面打印aPerson.height。
總結
Java的許多語法形式與C/C++類似,但在細節和具體實作上又有差別,需要小心。
對象,類別對象: 方法,域(資料成員)
Java是完全物件導向的語言。