final與static
阿新 • • 發佈:2022-03-14
final static 整理
final:
-
-
屬性:定義就必須直接賦值或者在構造方法中進行賦值,並且後期都不能修改(使用場景:某一個變數,值是不改變,無論哪個物件呼叫值都是一樣的,就可以用final修飾為常量)
-
- final int c=1; static final b=1;
- 這裡c和b的區別在於,b存放在靜態空間,不會在程式執行時被釋放,它永遠佔著記憶體直到程式終止,而c在程式用完它而不會再用到它的時候就會被自動釋放,不再佔用記憶體。當一個常數或字串我們需要在程式裡反覆反覆使用的時候,我們就可以把它定義為static final,這樣記憶體就不用重複的申請和釋放空間。
方法:定義必須有實現程式碼,並且子類裡不可被覆蓋。
-
-
Static:
-
-
如果類的某個屬性,不管建立多少個物件,屬性的儲存空間只有唯一的一個,那麼這個屬性就應該用static修飾,被static修飾的屬性被稱為靜態屬性,被static修飾的方法被稱為靜態方法。
-
static屬性可以使用物件呼叫,也可以直接用類名呼叫。
-
- eg:
public class Employee {
String name; //員姓名
double salary; //員工工資
static int count; // 靜態變數 員工數量
int myCount = 0; //成員變數
//無參構造
public Employee() {
}
//有參構造
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
count++; //員工數量自加1
myCount++; //自增1
}
//測試方法
public static void main(String[] args) {
Employee e1 = new Employee("lily", 9000); //建立lily的物件
System.out.println("name:" + e1.name + "\tsalary:" + e1.salary + "\tmyCount:" + e1.myCount + "\tcount:" + Employee.count); // lily 9000 1 1
Employee e2 = new Employee("alice", 3000); //建立alice的物件
System.out.println("name:" + e2.name + "\tsalary:" + e2.salary + "\tmyCount:" + e2.myCount + "\tcount:" + e2.count); //alice 3000 1 2
}
}
-
-
靜態方法可以被任何方法(靜態方法和非靜態方法)直接呼叫;
-
非靜態方法可以被非靜態方法直接呼叫;
-
非靜態方法不能被靜態方法直接呼叫,需要建立物件,用物件名呼叫。
-
-
不用類方法之間的呼叫
-
呼叫靜態方法,使用類名直接呼叫 ;
-
-
例題:
public class StaticTest {
//測試本來之間靜態方法和非靜態方法之間的呼叫
//靜態方法
public static void f() {
StaticTest test = new StaticTest();
test.a(); //靜態----非靜態 建立物件,通過物件名呼叫
StaticTest.g(); // 靜態---靜態 直接通過類名呼叫
}
//靜態方法
public static void g() {
}
//非靜態方法
public void a() {
StaticTest.g(); //非靜態---靜態 直接類名呼叫
b(); //非靜態--非靜態 直接呼叫
}
//非靜態方法
public void b() {
}
//不同類之間的呼叫 呼叫靜態方法---使用類名 呼叫非靜態方法---建立物件,通過物件名呼叫
} - 靜態程式碼塊:
-
-
看JVM類載入的過程:裝載、連線、初始化
static塊的執行發生在“初始化”的階段。初始化階段,jvm主要完成對靜態變數的初始化,靜態塊執行等工作。
-
構造程式碼塊
構造方法給物件初始化
-
static程式碼塊和構造程式碼塊同時出現時優先順序
-
-