Java 教程
- Java - 首頁
- Java - 概述
- Java - 歷史
- Java - 特性
- Java 與 C++
- JVM - Java 虛擬機器
- Java - JDK 與 JRE 與 JVM
- Java - Hello World 程式
- Java - 環境設定
- Java - 基本語法
- Java - 變數型別
- Java - 資料型別
- Java - 型別轉換
- Java - Unicode 系統
- Java - 基本運算子
- Java - 註釋
- Java - 使用者輸入
- Java - 日期和時間
Java 控制語句
- Java - 迴圈控制
- Java - 決策制定
- Java - If-else
- Java - Switch
- Java - For 迴圈
- Java - For-Each 迴圈
- Java - While 迴圈
- Java - do-while 迴圈
- Java - Break
- Java - Continue
面向物件程式設計
- Java - OOPs 概念
- Java - 物件和類
- Java - 類屬性
- Java - 類方法
- Java - 方法
- Java - 變數作用域
- Java - 建構函式
- Java - 訪問修飾符
- Java - 繼承
- Java - 聚合
- Java - 多型
- Java - 重寫
- Java - 方法過載
- Java - 動態繫結
- Java - 靜態繫結
- Java - 例項初始化塊
- Java - 抽象
- Java - 封裝
- Java - 介面
- Java - 包
- Java - 內部類
- Java - 靜態類
- Java - 匿名類
- Java - 單例類
- Java - 包裝類
- Java - 列舉
- Java - 列舉建構函式
- Java - 列舉字串
Java 內建類
Java 檔案處理
Java 錯誤和異常
- Java - 異常
- Java - try-catch 塊
- Java - try-with-resources
- Java - 多重 catch 塊
- Java - 巢狀 try 塊
- Java - Finally 塊
- Java - throw 異常
- Java - 異常傳播
- Java - 內建異常
- Java - 自定義異常
Java 多執行緒
- Java - 多執行緒
- Java - 執行緒生命週期
- Java - 建立執行緒
- Java - 啟動執行緒
- Java - 執行緒合併
- Java - 執行緒命名
- Java - 執行緒排程器
- Java - 執行緒池
- Java - 主執行緒
- Java - 執行緒優先順序
- Java - 守護執行緒
- Java - 執行緒組
- Java - 關閉鉤子
Java 同步
Java 網路
- Java - 網路
- Java - 套接字程式設計
- Java - URL 處理
- Java - URL 類
- Java - URLConnection 類
- Java - HttpURLConnection 類
- Java - Socket 類
- Java - 泛型
Java 集合
Java 介面
Java 資料結構
Java 集合演算法
高階 Java
- Java - 命令列引數
- Java - Lambda 表示式
- Java - 傳送電子郵件
- Java - Applet 基礎
- Java - Javadoc 註釋
- Java - 自動裝箱和拆箱
- Java - 檔案不匹配方法
- Java - REPL (JShell)
- Java - 多版本 Jar 檔案
- Java - 私有介面方法
- Java - 內部類菱形運算子
- Java - 多解析度影像 API
- Java - 集合工廠方法
- Java - 模組系統
- Java - Nashorn JavaScript
- Java - Optional 類
- Java - 方法引用
- Java - 函式式介面
- Java - 預設方法
- Java - Base64 編碼解碼
- Java - Switch 表示式
- Java - Teeing 收集器
- Java - 微基準測試
- Java - 文字塊
- Java - 動態 CDS 歸檔
- Java - Z 垃圾收集器 (ZGC)
- Java - 空指標異常
- Java - 打包工具
- Java - 密封類
- Java - 記錄類
- Java - 隱藏類
- Java - 模式匹配
- Java - 簡潔數字格式化
- Java - 垃圾回收
- Java - JIT 編譯器
Java 雜項
- Java - 遞迴
- Java - 正則表示式
- Java - 序列化
- Java - 字串
- Java - Process API 改進
- Java - Stream API 改進
- Java - 增強的 @Deprecated 註釋
- Java - CompletableFuture API 改進
- Java - 流
- Java - 日期時間 API
- Java 8 - 新特性
- Java 9 - 新特性
- Java 10 - 新特性
- Java 11 - 新特性
- Java 12 - 新特性
- Java 13 - 新特性
- Java 14 - 新特性
- Java 15 - 新特性
- Java 16 - 新特性
Java API 和框架
Java 類參考
- Java - Scanner
- Java - 陣列
- Java - 字串
- Java - Date
- Java - ArrayList
- Java - Vector
- Java - Stack
- Java - PriorityQueue
- Java - LinkedList
- Java - ArrayDeque
- Java - HashMap
- Java - LinkedHashMap
- Java - WeakHashMap
- Java - EnumMap
- Java - TreeMap
- Java - IdentityHashMap
- Java - HashSet
- Java - EnumSet
- Java - LinkedHashSet
- Java - TreeSet
- Java - BitSet
- Java - Dictionary
- Java - Hashtable
- Java - Properties
- Java - Collection
- Java - Array
Java 有用資源
Java - 非訪問修飾符
Java 提供了許多非訪問修飾符來實現許多其他功能。
用於建立類方法和變數的 static 修飾符。
用於完成類、方法和變數實現的 final 修飾符。
用於建立抽象類和方法的 abstract 修飾符。
用於執行緒的 synchronized 和 volatile 修飾符。
靜態修飾符
靜態變數
static 關鍵字用於建立獨立於為類建立的任何例項存在的變數。無論類的例項數量多少,都只存在一個靜態變數副本。
靜態變數也稱為類變數。區域性變數不能宣告為靜態。
靜態方法
static 關鍵字用於建立獨立於為類建立的任何例項存在的方法。
靜態方法不使用其定義所在類的任何物件的任何例項變數。靜態方法從引數中獲取所有資料,並根據這些引數計算某些內容,而不引用變數。
類變數和方法可以使用類名後跟一個點和變數或方法的名稱來訪問。
示例
靜態修飾符用於建立類方法和變數,如下例所示:
public class InstanceCounter {
private static int numInstances = 0;
protected static int getCount() {
return numInstances;
}
private static void addInstance() {
numInstances++;
}
InstanceCounter() {
InstanceCounter.addInstance();
}
public static void main(String[] arguments) {
System.out.println("Starting with " + InstanceCounter.getCount() + " instances");
for (int i = 0; i < 500; ++i) {
new InstanceCounter();
}
System.out.println("Created " + InstanceCounter.getCount() + " instances");
}
}
輸出
Started with 0 instances Created 500 instances
最終修飾符
最終變數
最終變數只能顯式初始化一次。宣告為 final 的引用變數永遠不能重新分配以引用不同的物件。
但是,物件中的資料可以更改。因此,可以更改物件的狀態,但不能更改引用。
對於變數,final 修飾符通常與 static 一起使用以使常量成為類變數。
示例
public class Test {
final int value = 10;
// The following are examples of declaring constants:
public static final int BOXWIDTH = 6;
static final String TITLE = "Manager";
public void changeValue() {
value = 12; // will give an error
}
}
最終方法
最終方法不能被任何子類覆蓋。如前所述,final 修飾符阻止方法在子類中被修改。
使方法成為最終的主要目的是方法的內容不應被任何外部人員更改。
示例
您可以在類宣告中使用 final 修飾符宣告方法,如下例所示:
public class Test {
public final void changeName() {
// body of method
}
}
最終類
使用宣告為 final 的類的主要目的是防止該類被子類化。如果一個類被標記為 final,那麼任何類都不能繼承 final 類的任何特性。
示例
public final class Test {
// body of class
}
抽象修飾符
抽象類
抽象類永遠不能被例項化。如果一個類被宣告為抽象,那麼唯一的目的是為了擴充套件該類。
一個類不能同時是抽象的和最終的(因為最終類不能被擴充套件)。如果一個類包含抽象方法,則該類應宣告為抽象。否則,將丟擲編譯錯誤。
抽象類可以同時包含抽象方法和普通方法。
示例
abstract class Caravan {
private double price;
private String model;
private String year;
public abstract void goFast(); // an abstract method
public abstract void changeColor();
}
抽象方法
抽象方法是一種沒有實現的宣告方法。方法體(實現)由子類提供。抽象方法永遠不能是最終的或嚴格的。
任何擴充套件抽象類的類都必須實現超類的所有抽象方法,除非子類也是抽象類。
如果一個類包含一個或多個抽象方法,則該類必須宣告為抽象類。抽象類不需要包含抽象方法。
抽象方法以分號結尾。例如:public abstract sample();
示例
public abstract class SuperClass {
abstract void m(); // abstract method
}
class SubClass extends SuperClass {
// implements the abstract method
void m() {
.........
}
}
Synchronized 修飾符
synchronized 關鍵字用於指示方法一次只能被一個執行緒訪問。synchronized 修飾符可以與任何四個訪問級別修飾符一起使用。
示例
public synchronized void showDetails() {
.......
}
Transient 修飾符
例項變數被標記為 transient 以指示 JVM 在序列化包含它的物件時跳過該特定變數。
此修飾符包含在建立變數的語句中,位於變數的類或資料型別之前。
示例
public transient int limit = 55; // will not persist public int b; // will persist
Volatile 修飾符
volatile 修飾符用於讓 JVM 知道訪問該變數的執行緒必須始終將其自己的變數私有副本與記憶體中的主副本合併。
訪問 volatile 變數會同步記憶體中所有變數的快取副本。Volatile 只能應用於例項變數,這些變數是物件型別或私有型別。volatile 物件引用可以為 null。
示例
public class MyRunnable implements Runnable {
private volatile boolean active;
public void run() {
active = true;
while (active) { // line 1
// some code here
}
}
public void stop() {
active = false; // line 2
}
}
通常,run() 在一個執行緒(您使用 Runnable 啟動的執行緒)中呼叫,而 stop() 在另一個執行緒中呼叫。如果在第 1 行中使用了 active 的快取值,那麼當您在第 2 行中將 active 設定為 false 時,迴圈可能不會停止。這時您需要使用volatile。