作者:王嘉暐
日期:2021/04/16
壹、環境安裝
一、JDK 介紹
Java Development Kit(JDK)是昇陽電腦針對Java開發人員發布的免費軟體開發套件(SDK,Software development kit)。
作為Java語言的SDK,普通使用者並不需要安裝JDK來執行Java程式,而只需要安裝JRE(Java Runtime Environment)。而程式開發者必須安裝JDK來編譯、除錯程式。
二、JDK 安裝
JDK 下載網址(此教學採用Java SE 8 JDK,並舉 Windows x64 為例):https://www.oracle.com/tw/java/technologies/javase/javase-jdk8-downloads.html
安裝完畢後,進入控制台>系統及安全性>系統>進階系統設定>環境變數>系統變數>新增>變數名稱:JAVA_HOME>變數值:(ex:C:\Program Files\Java\jdk-8)
設定PATH,環境變數>系統變數(Path)>編輯>新增>
輸入JDK與JRE位置
JDK:%JAVA_HOME%\bin
JRE:%JAVA_HOME%\jre\bin
三、測試
- 設定完畢,進行測試
開啟命令提示字元(cmd)
輸入 java -version(沒有出現Error表示設定成功)
貳、程式設計
一、IDE 整合開發工具介紹
- Apache NetBeans
- Eclipse(企業開發常用)
二、變數介紹(Variable)
ps:和其他程式語言C/C++、C# 大同小異
類別 | 資料型態 | 位元數 | 範圍 |
---|---|---|---|
整數 | byte | 8位元數 | 範圍:-128 ~ 127 |
整數 | short | 16位元數 | 範圍:-32768 ~ 32767 |
整數 | int | 32位元數 | 範圍:-2147483648 ~ 2147483647 |
整數 | long | 64位元數 | 範圍:-9223372036854775808 ~ 9223372036854775807 |
浮點數 | float | 32位元數 | 範圍:-3.402823E38~-1.401298E-45(ps:E-45為10的-45次方) |
浮點數 | double | 64位元數 | 範圍:-1.797693134E3.8~4.9406564584124E-324 |
布林值 | boolean | 1位元數 | true或false(注意:不像C/C++,可以以0或1代表false或true) |
字元 | char | 16位元數 | 範圍:’\u0000’ - ‘\uffff’(ps: Unicode編碼) |
三、基本宣告
- 最上方 package(包裹):專案所在之資料夾位置
package com.sample.app;
- 下方 import(導入):非本檔案之外來類別(class)
import java.io.PrintStream;
補充:Java SE 8 API(查詢Java所提供之所有API):https://docs.oracle.com/javase/8/docs/api/
- 類別 class:
class MyFirst{}
- 存取修飾字(Modifier):public、private、protected、default(可放在class類別前、method方法前、變數宣告前)
存取修飾字 | 權限 |
---|---|
public | 皆可存取 |
private | 同一個class才可存取 |
protected | 同一個package的class才可存取,不同的package得要有繼承關係才可存取(繼承為何,請看後面章節) |
default | 同一個package的class才可存取 |
public class MyFirstApp{}
private void method(){}
private int a;
存取修飾字 | 同一個class | 同一個package | 子類別child class | 不同package |
---|---|---|---|---|
public | Yes | Yes | Yes | Yes |
private | Yes | |||
protected | Yes | Yes | Yes | Yes(要繼承) |
default | Yes | Yes |
- 主方法 main method(注意:對初學者而言,宣告方式必須一模一樣):
public static void main(String[] args){}
main 只是一個方法名稱 並非是關鍵字
static(可以想成共用,往後會介紹) 這一個功能非物件化 就是直接執行
直接跑第一支程式,不是被呼叫的,沒有回應值,所以宣告 void
- 基本輸出
System.out.println("您好");
原本輸出寫法(不急!請繼續看下去,往後會介紹):
PrintStream out = System.out;
out.println("您好");
四、運算符號
算術(Arithmetic)運算符號
運算符號 | 功能敘述 |
---|---|
+ | 加 |
* | 乘 |
- | 減 |
/ | 除 |
% | 餘數 |
++ | 加一 |
-- | 減一 |
邏輯(logic)運算符號
運算符號 | 功能敘述 |
---|---|
> | 大於 |
< | 小於 |
>= | 大於等於 |
<= | 小於等於 |
== | 等於 |
!= | 不等於 |
&& | logic AND |
|| | logic OR |
! | logic NOT |
instanceof | reference instanceof ClassName // 判斷reference所指到的物件其型態是否和ClassName相容 |
位元(Bit)運算符號
運算符號 | 功能敘述 |
---|---|
& | bit AND |
<< | left bit shift |
| | bit OR |
>> | right bit shift with sign |
^ | bit XOR |
~ | 1補數 |
>>> | 同>>但左邊一律補零 |
其他運算符號
運算元 | 功能敘述 |
---|---|
= | 將右邊的值複製到左邊的變數 |
(type) | 將右邊的數值或reference轉換成type型別 |
+= | 將右邊的數值加上左邊的數值然後指定給左邊的變數 |
?: | 若?左邊成立則做:左邊否則做:右邊 |
, | 合併兩個運算視為一個敘述 |
(運算式) | 表示()內優先運算 |
. | Reference.ObjectMember或ClassName.ClassName // 存取物件或類別成員 |
new | 產生物件 |
優先權
種類 | 運算符號 | 結合順序 |
---|---|---|
group | (op) | left to right |
postfix | [] . (params) op++ op– | right to left |
prefix | ++op --op +op -op ~ ! | right to left |
creation or casting | new (type)op | right to left |
multiplicative | * / % | left to right |
additive | + - | left to right |
shift | << >> >>> | left to right |
relational | < > <= >= instanceof == | left to right |
equality | == != | left to right |
bitwise and | & | left to right |
bitwise exclusive or | ^ | left to right |
bitwise inclusive or | | | left to right |
logical and | && | left to right |
logical or | || | left to right |
conditional | ? : | right to left |
assignment | = += -= *= /= %= &= ^= |= <<= >>= >>>= | right to left |
seperator | , | left to right |
五、完整程式碼
package com.sample.app;
import java.io.PrintStream;
public class MyFirstApp {
public static void main(String[] args) {
PrintStream out = System.out;
out.println("您好");
System.out.println("您好");
}
}
參、物件導向(Object Oriented Programming,OOP)
一、前情提要
一、類別 class
在介紹什麼是物件導向之前,我們先介紹 class(類別)。
我們可以想像 class(類別)是一張設計圖,而在這張設計圖中,我們必須規劃一些項目,以汽車為例,一台汽車,可以有廠牌、里程數、價格等資訊…。
因此我們可以規劃一個類別如下:
class Car{
//宣告 公開 型別 變數
public String brand;
public int drive_km;
public int price;
//宣告 公開 型別 方法名稱(){}
public String getInformation(){
//回傳 廠牌:OOO,里程數:123,價格:123456
return "廠牌:" + brand+",里程數:" + drive_km + ",價格:" + price;
}
}
二、物件 object
物件(object)可以說是類別的實體產物(實例),也就是在有了汽車的設計圖的情況下,我們可以製作出很多台汽車,而每台汽車都是獨立的,彼此互不影響。
以下為舉例:
//實作汽車
Car Toyota = new Car("Toyota","1200",345678);
Car BMW = new Car("BMW","3400",5678912);
//印出資料
Toyota.getInformation();
BMW.getInformation();
二、介紹物件導向三大佬(三大特性)
- 封裝 (Encapsulation)
- 繼承 (Inheritance)
- 多型 (Polymorphism)
- 封裝 (Encapsulation)
封裝顧名思義就是將東西封起來、包裝起來。在程式中我們利用封裝將物件內部的資料包起來、隱藏起來(ex:設置 private),我們能利用特定允許之窗口向其索取資料(ex:物件本身所提供之介面interface),反之,若沒有經過允許之窗口來取資料,可能會吃閉門羹喔!!
例如:我們上面介紹可以透過 getInformation() 這個方法取得汽車資訊,然而我們(使用者)並不需要內部如何運作。在職場上,稱之為商業邏輯。
- 繼承 (Inheritance)
寫程式的過程中,會遇到一些大家(類別中)共同擁有的屬性(attribute)或方法(method),這時候,我們可以使用繼承來將這些屬性或方法交給另外的類別使用。我們稱提供屬性或方法的類別為父類別(parent class),而使用這些的類別為子類別(child class)。
舉汽車的類別為例,此時汽車為父類別,而使用父類別功能的 Uber 為子類別,請看以下範例。(後面會詳細教學詳細的繼承,因此這裡簡單地撰寫程式碼)
Car 父類別
public class Car {
public String run() {
return "run()...";
}
}
Uber 子類別
public class Uber extends Car{
public String reserve() {
return "reserve()...";
}
}
Main 主類別
public class MainClass {
public static void main(String[] args) {
Uber uber = new Uber();
System.out.println(uber.reserve());
System.out.println(uber.run());
}
}
- 多型 (Polymorphism)
多型可以說是:多個相同名稱的方法,傳入不同的參數,會執行不同的敘述(結果)
多型包含兩種:
多載(Overloading)
覆寫(Overriding)
多載(Overloading)
在相同類別(class)中,定義相同名稱,但是參數個數不同,或是參數型態不同的方法method(函式 function)。
廢話不多說,我們直接看範例(矩形面積):
//正方形面積 (邊長x邊長)
public int calculateArea(int length){
return length * length;
}
//長方形面積 (長x寬)
public int calculateArea(int length, int width){
return length * width;
}
覆寫(Overriding)
覆寫內容顧名思義就是將原有的內容蓋掉。在程式中,即為覆寫掉父類別中的方法(函式)
下面以動物類別為例:
class Animal{
public int foot = 1;
public int getFeet(){
return foot*4;
}
}
class Bird extends Animal{
public int foot = 1;
public int getFeet(){
return foot*2;
}
}
public class MainClass {
public static void main(String[] args) {
Animal animal = new Bird(); //此用法之後會詳細介紹,先簡單說明用法 -> 父類別 變數 = new 子類別,此也是多型的典型用法
System.out.println(animal.getFeet());
}
}