基本型別記得看一下。。。太自信臨場忘記哭阿
物件導向三特性基本題

封裝、繼承、多型

封裝 : 存取權限分為 private, default, protected 與 public,將屬性和方法包裝成類別方便外界對其存取,使用 scope 修飾子來提升安全性。
繼承 : 主要目的就是提高程式的重複使用性,子類別將會繼承到父類別中所有可以存取的成員,包括變數與方法。子類別可以加入新方法或是 override 父類別方法。
多形 : 使用同一個操作介面操作不同物件實例。

泛型

泛型提供我們在使用集合時編譯時期的安全檢查,可預先指定集合裡能存放的物件類型,<>內只能放參考型別(類別,陣列,介面),所以要放基本型別要放包裝後的(對應的包裝類別)。

StringBuffer 與 StringBuilder

String 類別不可以在原來的記憶體改變內容,已經產生的字串會丟到 String pool 等待下次需要時叫出。
StringBuffer 類別則可以在原字串所在記憶體改變字串內容,包含 append, insert, delete, replace。

StringBuffer 字串與 String 字串不可以比較 (沒有意義),如要比較要用同類別才有意義,如真的要比較可以使用 StringBuffer 的 toString 方法

StringBuilder 類別是 JDK 5 的新類別,其用法與 StringBuffer 類別完全一樣(append, insert, delete,
replace)

但是!
舊類別 StringBuffer 是 thread-safe(執行續安全),新類別 StringBuilder 則是 non-thread-safe

如果不考慮多執行緒的問題就可以使用 StringBuilder 來提升執行的效率

常見於結合 BufferedReader 的 readLine()方法進行文字串接,對執行資源損耗減輕不小。

甚麼是執行緒安全

三個指標 原子性 有序性 可見性

當「一個」類別在被「多個」執行緒存取的情況下,仍能「正確」運作,就是執行緒安全

  • 如果類別是 Stateless,它就是執行緒安全,因為「沒」有「共享」 的「狀態」 可以被修改。
  • 如果類別是 Immutable,它就是執行緒安全,因為沒有「可」修改的「狀態」。
  • 如果類別方法在操作狀態時不具備原子性(Atomicity),它就不是執行緒安全,會因為各種不同的時間差造成 race condition。

例如書上最常見的 count++,其實是 read-modify-write 3 個操作,如果兩個執行緒剛好一前一後讀到同一個值,那就會有一個 modify 的結果消失了(lost update)。

如何讓它 Atomic?

  • synchronized
  • java.util.concurrent.Lock
  • CAS (Compare-and-Swap)
    (e.g. AtomicInteger 的 compareAndSet)

感謝爪哇群 GC 大大的總結真是太精闢了 QQ

final 與 finally 與 finalize

final 為 Java 一關鍵字。

  • 若一個變數被宣告為 final,表示此變數在初始化過後不得再變更,也就是常數。
  • 若一個方法被宣告為 final,表示不能被 override
  • 若一個類別被宣告為 final,表示不能被繼承(絕子絕孫)
  • 若一個物件參考變數被宣告為 final,表示初始化後不能再指向另一個物件(更換門牌)

finally 為 Java 一關鍵字。

  • 是無論發生什麼情況皆會執行的程式區塊
  • 置於所有 catch { }的後面
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
System.out.println(getInt());
}

public static int getInt() {
try {
return 1;
} catch (Exception e) {
return 2;
} finally {
return 3;
}
}

猜猜會印出甚麼?
答案是 3!!!
不管有沒有異常,finally block 中都會被執行,其包含在 try catch 中有 return 的狀況。

try 語句在 return 前,執行完其他的操作,保留好 return 值,之後進入 finally block 時有幾種狀況 :

  • 如果 finally block 有 return 語句,會將前面保留的 return 語句覆蓋,如此無法得到在之前保留好的 return 語句。
  • 如果 finally block 沒有 return 語句,也沒有要改變 return 值,順序為執行完 finally 中的事情,再 return try 中保留的值。

詳見 https://itimetraveler.github.io/2017/09/20/%E3%80%90Java%E3%80%91try-catch-finally%E8%AF%AD%E5%8F%A5%E4%B8%ADreturn%E7%9A%84%E6%89%A7%E8%A1%8C%E9%A1%BA%E5%BA%8F%E6%80%9D%E8%80%83/

被考到了哭阿,但通常不會寫這種為了考而考的題目

(少考)
finalize 類似於解構函式,我們不能強制垃圾收集器(GC)執行和銷燬物件,但可以使用此方法,只能被呼叫一次。
Java 執行時環境 (JRE) 會呼叫 finalize() 方法來關閉連線,例如網路和資料庫連線。

static

  • 實體變數和方法若是宣告為 static,則此變數和方法即成為類別變數(或稱靜態變數)和類別方法(或稱靜態方法)
  • 宣告為 static 的變數和方法,是屬於此類別所有物件共用的
  • static 會在.class 檔載入時,將所有 static 的方法或變數載入 global 記憶體
  • static 方法不能被複寫(建構子也不行),但子類別可以直接呼叫父類別方法使用
1
2
3
4
5
6
7
8
9
10
11
12
public class Son extends Dad {
@Override
public void earnMoney() {
super.earnMoney();
System.out.println("goods");
}
public static void main(String[] args) {
Son.money(); //money 為父類別靜態方法
Son son = new Son();
son.earnMoney();
}
}

== 與 .equals

== 是比較記憶體位址而不是內容,如果要比較字串內容要使用 String 物件提供的.equals()作比較

Collection

主要分為 List 和 Set。(還有 Queue)

Queue 類似生活中的隊伍,有順序性,但只能對第一個元素做取出,取出即移除。適合資料消化操作。

LinkedList與ArrayList差別

  • ArrayList 為連續的線性空間。
    優點是用索引值的存取表現佳,但缺點為不適合對裡面元素做插入或移除

  • LinkedList 為鏈結的資料結構,非常適合對頭/尾元素進行處理。
    優點是適合對元素常常插入或移除,但缺點為用索引值的存取表現較差

如果要對自定義物件做大小排序請實作 Comparable 介面

Overload 和 Override

Overloading

  • Overloading 讓我們可以用統一的方法名稱來呼叫相同功能的方法,Java 會自動依據參數的數目及不同的資料型別,自動呼叫對應的方法
  • 無法根據回傳值型態的不同而區別

Override

  • 子類別繼承父類別後,不滿意父類別定義的方法,子類別可以在繼承後重新改寫,即為 override
  • 方法名稱、參數個數、參數型別與回傳值皆須跟父類別裡被覆寫的方法相同
  • JDK 1.5 開始,如回傳型態是類別,則可以是原方法回傳值型別的子類別
  • 存取修飾子的等級不可以小於原方法
  • 一方法在父類別被宣告為 final 或是 static 不可以被 override

JDK、JRE、JVM

簡單來說,JDK 包含 JRE,JRE 包含 JVM。

JVM 為 Java 虛擬機器,簡單來說是運行 Java 程式的地方,因為不同系統只要安裝 JVM 即可運行而讓 Java 實現跨平台。
JRE 為 Java 運行環境,包含 JVM、以及 Java 類別函式庫等。但不包含開發工具。
JDK 為齊全的 Java 開發工具包,包含 JRE 以及編譯器和指令(javac javadoc 等)

沒看到但寫一下

abstract 與 interface

  • 介面為定義規格用。
    透過 implements 來實作介面。
    Java8 以前,interface 所有方法皆為抽象方法。Java8 以後可以默認實作(default)。
    在 interface 中宣告之變數皆為 public static final。
    方法則是 public abstract。(沒有 static,因為要給人家用)
    可以利用 interface 達成多重繼承的模式。(因為 Java 不支援多重繼承)

  • 抽象方法沒有方法主體,且必須加上 abstract 修飾子。
    透過繼承來建立延伸子類別。一類別成為抽象類別就不可以產生實體(new sth)。
    abstract 類別內可以存在非抽象方法。抽象類別不一定要有抽象方法,但具有抽象方法的類別,一定要宣告為抽象類別。
    抽象類別作為父類別也可以拿來宣告新的物件(但 new 的新物件是非 abstract 的 subclass)。

不要濫用繼承

例外處理

CheckedException 和 RuntimeException

CheckedException : 一定要處理。

相較於程序性程式語言,物件導向程式語言的優勢是什麼?

簡答即為物件導向三大特性,有時會多聽到一種即為抽象

  • 封裝性(Encapsulation):
    物件導向程式語言能夠將數據和相關的操作(方法)封裝在一個物件中,將其作為一個獨立的單元進行操作,將數據和操作與其他部分隔離開來,從而提高了代碼的可重用性和可維護性。

  • 繼承性(Inheritance):
    繼承是物件導向程式設計的核心概念之一,可以使子類別繼承父類別的屬性和方法,並且可以在此基礎上進行擴展和重寫。這種機制可以提高代碼的可重用性和可擴展性,減少代碼的冗餘性。

  • 多態性(Polymorphism):
    多態性是指對同一個消息的不同對象可以有不同的反應。物件導向程式語言通過多態性實現了代碼的靈活性和可擴展性,可以讓程序更加具有彈性和可讀性。

  • 抽象性(Abstraction):
    抽象是物件導向程式設計的重要概念之一,它將對象的本質特徵抽象出來,形成一個抽象的類型。這種機制可以使代碼更加通用和具有可移植性,讓程序更加靈活和可擴展。

總的來說,物件導向程式語言具有更好的可維護性、可重用性、可擴展性和靈活性,能夠讓程序員更加高效地開發複雜的應用程序。

程序性程式語言的優勢

  • 效率高 :
    程序性程式語言通常更接近計算機硬件,能夠直接操作內存和 CPU 等硬件資源,因此其執行速度相對較快,適合用於需要高效處理大量數據和需要對系統資源進行直接控制的場景。
  • 較好入門 :
    因為不需要學習物件導向的概念,程式為依序執行。對初學者較友善

但學 C 語言的指標會讓你想哭

什麼是 ORM?

Object Relational Mapping 物件關聯對應

DB 和 Java 程式(或任一 OOP 程式語言)是 2 種不同的東西。
為了要實現在 2 者之間的轉換而有了這樣的技術。(可以想成在是可在程式中使用的虛擬資料庫)
在 Java 程式中,即是所謂 POJO(這裡指廣義 JAVA BEAN 或稱 VO)中的屬性對應欄位。
常見的 ORM 框架有 Hibernate、MyBatis、Spring Data JPA。
MyBatis 優勢為寫原生 SQL 比較方便。

SQL

inner、left、right join 的差別

只要有 SQL 這題幾乎必考

  • inner join : 表格都有值的資料會顯示
  • Left join : 只顯示左邊表格有的值,右邊表格無此值者會顯⽰ null
  • right join : 只顯示右邊表格有的值,左邊表格無此值者會顯⽰ null

還有 2 種知道”可能”會加分吧(?)

  • full join : 將合併表格的所有欄位都顯示出來
  • cross join : 交叉合併查詢(Cross Join )是關聯式代數的卡迪生乘績運算,查詢結果的紀錄是 2 個資料表紀錄的乘積。
1
Select * From 表A Cross Join 表B;

表 A 有 5 筆紀錄,表 B 有 8 筆紀錄,交查合併後會得到 5 * 8=40 筆的紀錄,如果沒有指名欄位,欄位數就是 2 個資料表的欄位總數。

order by 要會寫

前端和後端是什麼?

懷疑我被刁難 QQ

前端:指與用戶直接互動的界面,主要由 HTML、CSS 和 JavaScript 等技術構建。前端開發人員負責設計和實現這些界面,使其具有良好的用戶體驗。

後端:指在服務器端處理客戶端請求和業務邏輯的部分,通常由一些特定的程式語言、框架和庫實現。後端開發人員負責編寫和維護這些程式,保證其能夠有效地處理請求,並返回正確的結果。

JSP 是前端還是後端? 為什麼

JSP(JavaServer Pages)是一個基於 Java 技術的伺服器端腳本語言,用於動態網頁開發。因此,JSP 被歸類為後端技術,用於網頁後端的程式邏輯處理。

JSP 的基本思想是在一個 HTML 文件中嵌入 Java 代碼,這些代碼通過伺服器端運行並生成 HTML 文件返回給客戶端。JSP 可以通過標籤庫和自定義標籤來實現對動態網頁的設計和渲染,同時也支持多種資料庫操作。

總之,JSP 處理的是網頁的後端業務邏輯,它將伺服器端的資料轉換為 HTML,再返回給客戶端展示,所以 JSP 屬於後端技術。