標籤:通過 dss 轉換 strong hit extend java基礎 替換 method
目錄
[TOC]
1. 修飾符(存取控制)
default: 是不寫存取控制符
2. static關鍵字2.1 用法
修飾屬性、方法等
2.2 static方法2.2.1 static方法特點
- 被聲明為static的成員在記憶體中只儲存了一份,儲存在方法區中
- 被聲明為static的成員會在類載入的時候載入進記憶體,而其他非靜態成員是在建立對象的時候才會去分配記憶體
- 被static修飾的成員可以直接通過類名來訪問,因為它們不依賴於對象。類名.方法、類名.屬性
- 對於一些不常改變的對象可以聲明成靜態成員,這樣就可以共用這一份資源,而且不會浪費記憶體
- 一些工具方法適合聲明成靜態,因為可以直接拿來調用,更方便,但是不是所有的方法都適合聲明成靜態,因為靜態成員的生命週期長
- 對於靜態變數,可以通過類名和引用來訪問,建議通過類名來訪問,不建議通過引用來訪問
- 靜態方法,沒有隱式this,所以在靜態方法中無法方位執行個體中的變數,方法。執行個體方法傳入了隱式this,可以訪問執行個體的屬性和變數
- 靜態方法應用情境: 操作與參數有關於對象無關(對對象屬性沒有做操作)時,定義為靜態方法,例如Arrays.sort()。也就是說static方法的作用在於提供一些"工具方法"和"Factory 方法"
2.2.2 案例
package src.basic.language;import java.util.HashSet;import java.util.Iterator;/* * 這個類主要講了Static關鍵字的用法 * */public class StaticKeywords { static int paramStatic = 0; int paramClass; public static void main(String [] args) { HashSet<String> set = new HashSet<String>(); set.add("滾滾"); set.add("加油"); set.add("向前滾"); // 對於static的方法、屬性,可以不對類進行執行個體化,也可以調用 StaticKeywords.traverSetWithList(set); StaticKeywords.traverseWithIterator(set); // 被聲明為static的成員在記憶體中只儲存了一份,如果在一個地方修改了這個靜態變數的值,那麼其他對象引用這個屬性的值也會做對應的修改 /* * 這裡例子省略,可以在備調用的類中聲明一個static變數,之後在本類中執行個體化兩個這個類型的變數來做觀察 * */ } public static void traverSetWithList(HashSet <String> set) { Object [] objs = set.toArray(); for (Object obj : objs) { System.out.println(obj); set.add("再滾一次"); } System.out.println(); } public static void traverseWithIterator(HashSet <String> set) { // 在靜態方法中,沒有飲食的傳入this,下面這條語句報錯 // this.paramClass = 1; // 靜態屬性通過類名.屬性來確定 StaticKeywords.paramStatic = 20; Iterator<String> itr = set.iterator(); while(itr.hasNext()) { System.out.println(itr.next()); } System.out.println(); } public void testStatic() { this.paramClass = 20; StaticKeywords.paramStatic = 30; } }
2.3 static塊
屬於類的代碼塊,在類載入期間執行的代碼塊,只執行一次,可以用來在軟體中載入靜態資源
應用情境:
- 常常用於載入靜態資源(圖片、音頻等)
2.3.1 案例
public class StaticKeywords { // 定義了一個靜態塊 static { // 儲存在方法區中,在類載入的時候執行的代碼塊 System.out.println("靜態塊執行"); } public static void main(String [] args) { }}// 執行結果 靜態塊執行 // main函數中沒有任何代碼,但是還是列印了靜態塊的語句,說明靜態塊在所有類執行個體化之前執行
3. final關鍵字
final修飾的成員變數以及方法,都不能改變
- 修飾變數:變數不能被改變
- final修飾成員變數的兩種方式:
- 聲明的同時初始化
- 構造方法中初始化
- final修飾方法變數
- final修飾方法變數時,定義時可以不用賦值,只需要在使用前賦值即可,賦值之後不可修改
- 修飾方法:方法不能被重寫
- 修飾類:類不能被繼承,但是可以繼承其他類
```Java
package src.basic.language;
public class KeyWordsFilnal {
// 聲明的同時修飾變數
final int a = 5;
// 聲明的同時若沒有初始化,要在建構函式中初始化final int b;public KeyWordsFilnal() { // TODO Auto-generated constructor stub // 構造方法中初始化 b = 10;}void finalParam() { // 在類方法中, final int c; // 報錯,使用之前要賦值 // System.out.println(c); c = 6; // 報錯 // c = 7;}final void finalMethod() {}public static void main(String [] args) { KeyWordsFilnal obj = new KeyWordsFilnal();}
}
// final的類可以繼承其他的類
final class KeyWordsFinalChild extends KeyWordsFilnal{
// 報錯,final修飾的方法不能被重寫
// void finalMethod() {}
}
// 報錯,final修飾的類不能繼承
// class KeyWordsFinalGrandChild extends KeyWordsFinalChild{}
```
4. static final常量
由static final修飾的成員變數成為常量,必須在聲明的同時初始化,不可以被改變。由static final修飾的常量會在編譯期間被替換。
4.1 規則和建議
- static public修飾的變數必須在聲明時就賦值
- 訪問static public修飾的常量和static關鍵字修飾的靜態變數相同
- static public修飾的常量不可改變
- 建議常量所有字母都大寫
- 在編譯時間會自動替換為具體的值,相當於C和C++裡面的宏,執行效率較高
4.2 案例
package src.basic.language;class KeywordsStaticFinal { public static void main(String [] args) { // 在編譯時間,程式還未執行前,KeywordsStaticFinal.PI被替換為3.14159 // 這句話和System.out.println(3.14159)是一樣的,由於少了一步轉換的操作,使用常配量序運行效率更高 System.out.println(KeywordsStaticFinal.PI); } public static final double PI= 3.14159; // 編譯錯誤,static public修飾的變數必須在聲明時就賦值 // public staic final int NUM;}
java基礎01 存取控制,static、final和static final