Java 簡介及基礎語法

Java 簡介

程式的定義

什麼叫程式,其明確的定義如下 :

1. 一行一行往下執行
2. 具人工智慧決策分析的功能 –if
3. 具有重複執行的功能 — 迴圈

純物件導向

物件導向程式有許多種,比如C/C++、Visual C++、Java, C#、Python、PHP。但只有 Java 及 C# 是純物件導向語言。其他語言,甚至是 C++,都不是純物件導向程式。

什麼是純物件導向程式呢? 如果所有程式碼都包含在class{} 之內,才叫純物件導向程式。

Java 技術

Java SE : Java Platform, Standard Edition : 標準開發平台,開發 applet 及應用程式,可執行於 web 及桌上型電腦的程式。

Java EE : Java Platform, Enterprise Edition。廣泛使用於大型企業中,建立伺服器端及客戶端的分散式應用程式,如網路購物程式。Java EE以 Java SE 為基礎,延伸開發出其他的API,支援大工程,高效能的企業軟体。

Java 編譯流程

Java 原始碼完成後按 F6 執行,就會產生一連串的動作。首先啟動 javac 編譯程式,將原始碼編譯成 .class檔, 然後再啟動 java 虛擬機器執行 .class檔。

“java” 這支程式又稱為 Virtual Machine 虛擬機器。每個作業系統都有自已的VM,如此就可以達到真正的跨平台。也就是說程式碼只要在某個系統上編譯一次,其產生的 class/jar 就可以通用於不同的作業系統,而且不需再針對不同的作業系統重新編譯。

java_compile

物件導向

OOP(Object-Oriented Programming) 於 1967 年的 SIMULA-67 程式語言掘起,後來變成了一門學術科目,並由 C++、Java、Visual C# 等實作其理論。

在 1967 年代,電腦還算是剛起步新產品,Ram 是非常昂貴的產品。然而物件導向理論需消耗大量的記憶体才可實現。所以早期物件導向只是一門非常冷門的理論,它只是某些人為了滿足研究的興趣所產生出來的垃圾。到了現在普通主機板可以安裝 128 G 以上的 Ram,這讓物件導向開始火紅。而且要是沒有物件導向理論,視窗作業系統根本不可能實作出來。

OOP 不同於早期的程序化語言,主要的特性如下

模組化 : 將大工程的程式碼分成小模組,易於分工
資訊隱藏 : 將重要的資訊隱藏,不讓外界得知
重複使用 : 相同的功能的程式碼不需重複撰寫
可任意插拔及易於除錯 : 像樂高一樣可隨意組合,且容易找出錯誤

OpenJDK 安裝及下載

JDK 全名為 Java Development Kit (Java 開發套件),也就是執行 Java 時所需要的函數庫,以 .jar 的檔案格式存在。

JDK 從 1~4 皆由昇陽 (Sun) 開發,到了 5.0 版被 Oracle 併購。

Oracle 到 8.0 版還還提供免費的 JDK,但到了 9.0 以後開始要收費,所以業界都開始轉用 OpenJDK。

OpenJDK 由網路社群開發,完全免費。不論是 Oracle 官方 JDK 還是 OpenJDK,都以 OpenJDK 為核心,所以可以把這二個視為一模一樣,只不過官方的 Oracle JDK 加入一些一般人用不到的功能。

請到 Adoptium 或到微軟的網頁 https://learn.microsoft.com/zh-tw/java/openjdk/download 下載。OpenJDK 11、17、21 三個版本為 LTS(Long Time Support) 版,其它非 LTS 請不要使用。

安裝 OpenJDK 時,需把「設定或重寫 JAVA_HOME 變量」選擇 「安裝在本機」。

早期的 JDK 需手動設定 Path 變數,但現今 OpenJDK 如果有經上述的「修改 PATH 變數值」及「設定或重寫 JAVA_HOME 變殘」安裝到本機時,就不用再手動設定 PATH。

要測試是否有安裝成功,請進入 DOS 模式,並執行 java -version,若出現如下畫面,表示安裝設定成功。

java_version

IDE

IDE 全名為 Integration Development Environment (整合開發環境)。目前常見的有Eclipse、Netbeans、Intellij IDEA 這三種。

Eclipse 在 2016 年就被業界全面下架,建議請趁早換掉。

NetBeans 是 Oracle 為了取代 Eclipse 所開發的IDE,現今交由 Apache 維護開發。此 IDE 的功能及效能遠比Eclipse好很多。

Intellij IDEA 由 JetBrain 開發,功能又比 NetBeans 更為強悍。

Netbeans 安裝

使用 NetBeans IDE,需先安裝 OpenJDK 才可安裝 NetBeans。請依上述方式操作。然後由如下網址下載 NetBeans : https://netbeans.apache.org/download/index.html

進入網站後請選擇最新版本,然後選取 Installers and Packages 版本,比如 Apache-NetBeans-25-bin-windows-x64.exe (SHA-512, PGP ASC),下載後直接安裝即可。如果沒有 Installer and Packages 版,就選 zip 免安裝檔直接解開即可。

安裝 Intellij IDEA

如果使用 Intellij IDEA,不需事前安裝 OpenJDK,可以在安裝 Intellij 後,在第一次開啟專案時選擇下載 ms OpenJDK 21的版本。不過為了統一,還是請先安裝 ms OpenJDK 21,然後再安裝 Intellij IDEA。

請由如下網址 https://www.jetbrains.com/idea/download/?section=windows 下載 Community 版本。安裝時請將所有選項都打勾。

NetBeans 開啟新專案

Java 程式的撰寫或練習,都是以開啟專案開始,請開啟 NetBeans 由 File/New Project進入, 然後選取 Java with Ant/Java Application。

java_newproject

Project Name : 本專案的名稱,首字請用大寫, 如 FirstApp。Project Folder : 請在C: 或 D: 新增一個專門存放 Java 程式的目錄。最後請確保Create Main Class有打勾。

java_newproject2

Hello world

每種程式語言的第一個教學,都是要學會如何列印 Hello world。如下代碼紅色部份一定要背起來,相關細節會在後續課程中說明。

若要執行程式碼, 直接按F6即可

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package firstapp;
/**
 *
 * @author mahal
 */
public class FirstApp {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        System.out.println("Hello, World");
    }
}

中文亂碼

記得早期 NetBeans 8.0 在列印中文時都正常,但現在 NetBeans 25 版在列印中文都會出現亂碼,而網路上的大部份教法全都沒用。

後來本人發現需在 System.out.println() 之前使用 System.setOut 設定輸出格式,如下代碼所示

package net.ddns.mahaljsp;

import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Test {
    public static void main(String[] args) {
        try {
            System.setOut(new PrintStream(System.out, true, "UTF-8"));
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("Hello,大家好");
    }
}

Intellij IDEA 開啟新專案

使用 IntelliJ 開啟新專案,請依下圖設定。在 Build system 可以選擇 IntelliJ 或者 Gradle。IntelliJ 比較簡單但後續需手動管理,Gradle 比較複雜但對專案管理非常方便,所以建議使用 Gradle。

開啟 Main.java 即可按右鍵/Run Main.main()。

如果是大型專案,請設定上方的 Current File/Edit Configurations,選擇 Application,然後依下圖設定。重點是選輸入 Name,然後在 -cp 選擇 xxx.main,最後再選擇 xxx.Main

todo

命令執行程式

在 NetBeans 按 F6 就可以執行程式,但真正執行程式的方式是在 DOS 視窗執行如下指令

cd .\src
javac net/ddns/mahaljsp/Test.java
java net/ddns/mahaljsp/Test

請注意上述的路徑就算是在 Windows 系統都必需使用 “/”,而非 “\”,而且編譯好的檔案是 Test.class,必需把 .class 刪除掉

如果使用 NetBeans 編譯,會把編譯的 .class 放置在 build 目錄中。

另外請注意,使用命令執行程式時,必需把 System.setOut 註解掉,否則中文輸出又會變成亂碼。

通用程式

如何自動判斷是在 NetBeans 輸出還是在 DOS 命令視窗執行呢,可以使用如下代碼自動判斷

package net.ddns.mahaljsp;

import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Test {
    public static void main(String[] args) {
        try {
            if (System.console()==null)//NetBeans 輸出
                System.setOut(new PrintStream(System.out, true, "UTF-8"));                    
        }
        catch (UnsupportedEncodingException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("Hello,大家好");
    }
}

註解(Comments)

上面代碼有許多灰色的部份, 那是註解的意思, 通常是用來解說為什麼要這麼寫, 以防日後忘記.

// : 單行註解

/* ….*/ : 多行註解

@Override : 說明下面一行的程式碼是覆寫(可有可無)

/**….*/ : 註解文字
會將其下的程式碼寫入 API 文件中,需使用到 javadoc.exe 來產生文件說明檔。
javadoc -verbose -private Puppy.java (private是指private等級(含)以上的存取權限都可以寫入文件檔中)

程式進入點

public static void main(String[] args) 是一個很特殊的函數,稱為程式進入點。
在眾多的 public class 中,只能有一個 public static void main(String[] args)。

常用符號

java 常用符號需特別說明如下

{}  大括號 curly brackets
[]  中括號 square brackets
()  小括號 Paentheses
;   分號 Semicolons
,    逗號 Commas
”   單引號 Single quotation
” ” 雙引號 Double quotation

System.out.println

println 可以單純列印文字,而且會自動換行,裏面的參數可以有雙引號所包含的文字,或是沒有雙引號的數字計算,或都使用 “+” 將文字數字串在一起。

請注意如下 1/2 的結果是 0,因為整數除以整數結果還是整數。

public static void main(String[] args) {
    System.out.println(5+8/2-4);
    System.out.println("5+8/2-4 = "+(5+8/2-4));
    System.out.println("1/2 = "+ (1/2));
}
結果 : 
5
5+8/2-4 = 5
1/2 = 0

由上可知要列印的資料分為文字及數字。

Java八大原生(Primitive)基本資料

文字及數字又細分如下八種,稱為 Java 八大原生基本資料。

指令 中文說明 空間 範圍值
byte 位元組 1byte -128~127
short 短整數 2byte -32768~32767
int 整數 4byte -21億~21億
long 長整數 8byte -263~263-1
float 單精度浮點數 4byte 精準到小數第7位
double 雙精度浮點數 8byte 精準到小數第15位
char 字元 2byte 0~65535
boolean 布林值 true/false 實際大小依VM而不同

格式化列印 printf

如果想要列印文字跟數字合在一起的字串,printf() 是最佳的解決方式,printf如下使用
%f : 代表小數
%d : 代表整數
%s : 代表字串
%c : 代表字元

public static void main(String[] args) {
    double price=12.5;
    int qty=10;
    System.out.printf("單價 = %.2f, 數量 : %d, 總價 : %.2f\n", price, qty, price*qty);
}
結果 : 
單價 = 12.50, 數量 : 10, 總價 : 125.00

String

String.format 可以產生格式化字串,用法跟 printf 一樣,只是它是單純產生一字串,不會列印。

package net.ddns.mahaljsp;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        G.encoding();
        Scanner si=new Scanner(System.in);
        System.out.printf("請輸入單價 : ");
        float price=si.nextFloat();
        System.out.printf("請輸入數量 : ");
        int qty=si.nextInt();
        String total=String.format("單價 : %.2f, 數量 : %d, 總價 : %.2f", price, qty, price*qty);
        System.out.println(total);
        
    }
}
結果 : 
請輸入單價 : 20.5
請輸入數量 : 10
單價 : 20.50, 數量 : 10, 總價 : 205.00

變數宣告

Java 屬於強型語言,所以在使用變數之前一定要宣告其型態。變數宣告的目的,是跟系統要求一個特定大小的記憶体空間,語法如下

型態 變數名稱 [=值]

int a; //宣告
a=10; //指定值

因為宣告及指定常常伴隨發生,所以上述二行可以簡化成一行

int a=10;

若有多個同型態的變數,可以精簡如下,中間用 “,” 隔開

double length=176.5, weight=52.3;

原生資料複制

int id=10;
int saleId=id;
id=50;

上述二個變數是獨立的,將id變更為 50 後,saleId 還是維持原來的 10。不過請注意,這只適用在原生基本資料型態而以,若是遇上物件參考那就不一樣,這點日後會討論。

變數初始化

區域變數需手動初始化,若未初始化就將之取出,會出現 compile error。

物件變數及類別變數會自動初始化為預設值,如 int 為 0,float 為 0.0,char 為 \0000,boolean 為 false,物件為 null。致於什麼是物件/類別變數,等進入物件導向課程即會說明。

變數命名規則

變數的命名,非常重要,在專案的開發過程,會花不少時間思考變數的名稱,甚至是修改變數名稱。所以再命名時,一定要非常謹慎小時,請務必遵循如下規則。

1. 使用匈牙利命名法 : 首字小寫, 第二個單字(含)後, 首字大寫,如  thisIsABook。這是Java的慣用法
2. 變數中間不可以有+-*/$#@等特殊符號,空格也不行。
3. 中間可以使用底線,如 this_is_a_book。這是C語言的慣用法。

4. 首字不可以為數字 : 如 2score,絕對禁止。
5. 首字可以為底線 : 如 _score,但不建議,因為在其他應用上,是屬於系統級變數。
6. 類別變數, 首字大寫 : 如 public class HelloTest。

其他注意事項

各種進位表示法

16進位 : int x=0x05fc; //加0x
8進位 : int y=071; //加 0
2進位 : int z=0b1101; //加 0b

分隔符號

自Java SE 7後,新增了底線當分隔號以方便讀取,所以底下的語法是正確的。
int a=3_000_0_0;

浮點數

float f=30.5; 此行會編譯錯誤,因為 30.5 預設是 double ,所以需寫成 30.5f(F),強制轉成 float。

近似值

底下因為精準度的關係會變成false

double x=0.3+0.3+0.3;
System.out.println(x==0.9); 結果是 false

需改如下提高精準度就會變成 true

BigDecimal y=new BigDecimal("0.3");//請注意要用字串 "0.3"
y=y.add(y).add(y);
System.out.println(y.dobuleValue()==0.9);

 常數

只要值一定義好就不可改變稱為常數,需在宣告前加上 final,如下

final int NUMBER_OF_MONTHS=12;

 原生資料儲存位置

static 的類別變數存放在 Global 區,區域變數存放在 Stack 記憶体區,Field 變數(物件變數)存在 Heap 區。

java_memory

特別注意一下,就算在區域或區塊中有一程式如下

String s=new String("Hello World);

new 出的字串是一個物件,其實体存放在 heap 區,但該物件的參考內容值 ==> s,則是在放在 stack 中

 運算子

指定運算子 =   +=    -=    *=    /=   %=   &=   |=   ^=   >>=   <<=   >>>=
算數運算子    +   –   *   /   %   ++   —
比較運算子 >   <   >=   <=   ==   !=
邏輯運算子 &&   ||
位元運算子 &   |
位移運算子 >>   <<
三元運算子  (boolean) ? express1:express2

int i=6;
int j=++i; //先加1再處理
i為7, j也是7

int i=6;
int j=i++; //先處理再加1
i為7, 但j為6

 運算子優先順序

()   ++—%   */   +-

 型態強制轉換及自動升級

數值只能指定到較大或相同的資料型態變數

隱式轉換

指定較小型態到大型態變數,會進行自動升級,比如把 int 放到 float,int 會升級成 float。

二個 int 相乘產生超出 int 的最大範圍值時,需使用 long 接收結果。

強制轉換

int num1=10, num2=20;
byte num3=(byte)(num1+num2); //需手動注意相加結果是否會超出byte

float 強制轉成 int 後,小數點全數刪除

byte, char, short 在運算前,會自動升級為 int,所以

byte b1=1, b2=3, b3;
b3=b1+b2;會出現編譯錯誤,需要強制轉換為byte才行

float f=27.9; 也會編譯錯誤,因為27.9是double,需使用27.9f

字串與數字

System.out.println(5+3+”=”+5+3);
結果為 : 8=53

原因 :
前面的 5+3 : 為數字的運算,所以先算出結果為 8,
然後為了跟字串 “=” 相結合(concat),全轉為字串 : “8=”
後面的 5+3 全都轉為字串的運算 : 8=53

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *