作者:王嘉暐
日期: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 整合開發工具介紹

  1. Apache NetBeans
  2. Eclipse(企業開發常用)

二、變數介紹(Variable)

ps:和其他程式語言C/C++、C# 大同小異
類別資料型態位元數範圍
整數byte8位元數範圍:-128 ~ 127
整數short16位元數範圍:-32768 ~ 32767
整數int32位元數範圍:-2147483648 ~ 2147483647
整數long64位元數範圍:-9223372036854775808 ~ 9223372036854775807
浮點數float32位元數範圍:-3.402823E38~-1.401298E-45(ps:E-45為10的-45次方)
浮點數double64位元數範圍:-1.797693134E3.8~4.9406564584124E-324
布林值boolean1位元數true或false(注意:不像C/C++,可以以0或1代表false或true)
字元char16位元數範圍:’\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
publicYesYesYesYes
privateYes
protectedYesYesYesYes(要繼承)
defaultYesYes
  • 主方法 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
instanceofreference 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 castingnew (type)opright 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();

二、介紹物件導向三大佬(三大特性)

  1. 封裝 (Encapsulation)
  2. 繼承 (Inheritance)
  3. 多型 (Polymorphism)
  1. 封裝 (Encapsulation)

封裝顧名思義就是將東西封起來、包裝起來。在程式中我們利用封裝將物件內部的資料包起來、隱藏起來(ex:設置 private),我們能利用特定允許之窗口向其索取資料(ex:物件本身所提供之介面interface),反之,若沒有經過允許之窗口來取資料,可能會吃閉門羹喔!!

例如:我們上面介紹可以透過 getInformation() 這個方法取得汽車資訊,然而我們(使用者)並不需要內部如何運作。在職場上,稱之為商業邏輯。

  1. 繼承 (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());
	}

}
  1. 多型 (Polymorphism)

多型可以說是:多個相同名稱的方法,傳入不同的參數,會執行不同的敘述(結果)

多型包含兩種:

  1. 多載(Overloading)

  2. 覆寫(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());
	}
}