static關鍵字,main()方法,代碼塊,final關鍵字
static關鍵字的使用:
-
static:靜態的
-
static可以修飾:屬性、方法、代碼塊、內部類
-
使用static修飾的變數:靜態變數(類變數)
3.1屬性:
實體變數:我們創建了多個類的物件,每個物件都擁有一套獨立的類的非靜態屬性,當修改其中一個物件的非靜態屬性時,不會導致其他物件中相同的屬性值更改,
靜態變數:當我們創建了多個物件時,多個物件共享一個靜態變數,當我們修改某一個物件的靜態變數時會導致其他物件呼叫此變數是修改過的,
3.2 static修飾屬性的其他說明:
- 靜態變數隨著類的加載而加載,可以通過"類.靜態變數"的方法進行呼叫,可以不用創建類的物件,
- 靜態變數早于類的創建,
- 由于類只會加載一次,靜態變數在記憶體中也只會存在一份,存在方法區的靜態域中,
3.3static屬性舉例:
System.out,Math.PI,
-
使用static修飾方法,靜態方法
-
隨著類的加載而加載可以通過"類.靜態變數方法"的方法進行呼叫,可以不用創建類的物件,
-
靜態方法只能呼叫靜態方法或者靜態變數
非靜態方法可以呼叫非靜態方法屬性或者靜態方法屬性
-
-
static注意點:
靜態方法中不能用super、this關鍵字,
-
開發中如何確定一個屬性是否要宣告為static的?
- 屬性可以被多個物件所共享的,不會隨著物件不同而不同的,
- 類中的常量也常常宣告為靜態的,
開發中如何確定一個方法是否要宣告為static的?
- 操作靜態屬性的方法,通常設定為static的
- 工具類的方法,習慣上宣告為static的,如Math,Arrays
類變數VS實體變數記憶體決議:

單例設計模式
什么是單例設計模式?
- 單例類只能有一個實體,
- 單例類必須自己創建自己的唯一實體,
- 單例類必須給所有其他物件提供這一實體,
單例模式優缺點
優點:
- 1、提供了對唯一實體的受控訪問,
- 2、由于在系統記憶體中只存在一個物件,因此可以節約系統資源,對于一些需要頻繁創建和銷毀的物件單例模式無疑可以提高系統的性能,
- 3、允許可變數目的實體,
缺點:
- 1、由于單例模式中沒有抽象層,因此單例類的擴展有很大的困難,
- 2、單例類的職責過重,在一定程度上違背了“單一職責原則”,
- 3、濫用單例將帶來一些負面問題,如為了節省資源將資料庫連接池物件設計為的單例類,可能會導致共享連接池物件的程式過多而出現連接池溢位;如果實體化的物件長時間不被利用,系統會認為是垃圾而被回收,這將導致物件狀態的丟失,
區分餓漢式和懶漢式
? 餓漢式:
? 好處:餓漢式是執行緒安全的
? 壞處:物件加載時間過長
? 懶漢式:
? 好處:延遲物件創建,
? 壞處:
單例模式的餓漢式實作
先創建實體
/**
*餓漢式:
* 1.類的單例設計模式就是采取一定方法保證整個軟體系統中,對某個類只能存在一個物件實體,
*
*/
public class Bank {
//1.私有化構造器
private Bank(){
}
//2.內部創建類的物件
//4.因此物件也要宣告為靜態的
private static Bank instance = new Bank();
//3.提供公共方法,回傳類的物件
public static Bank getInstance(){
return instance;
}
}
單例模式的懶漢式實作
先判斷是否創建,未創建就先創建,創建好了就回傳實體
/**
*懶漢式單例模式
*!!!目前執行緒不安全!!!
*/
public class Order {
//1.私有化構造器
private Order(){
}
//2.生命當前類物件,沒有初始化
//4.物件也要宣告static
private static Order instance = null;
//3.宣告public、static的回傳當前物件的方法
public static Order OrdergetInstance(){
if(instance == null)
instance = new Order();
return instance;
}
}
main()方法
main()方法使用說明:
- main()方法作為程式入口
- main()方法也是一個普通的靜態方法
- main()方法可以作為我們與控制臺互動的方式
main()方法作為程式入口的例子:

IDEA在控制臺給main()方法傳參步驟:


代碼塊
代碼塊相關知識:
/**
* 類的成員之四,代碼塊(初始化塊)
*
* 1.作用:用于初始化;類,物件
* 2.代碼塊如果有修飾必須用static
* 3.分類:靜態代碼塊/非靜態代碼塊
*
* 4.靜態代碼塊
* >內部可以有輸出陳述句
* >隨著類的加載而執行,而且只執行一次
* >初始化類的資訊
* >多個靜態代碼塊按順序執行
* >靜態代碼塊執行優先于非靜態代碼塊執行
* >靜態代碼塊只能呼叫靜態屬性、靜態方法,不能呼叫非靜態的結構
*
* 5.非靜態代碼塊
* >內部可以有輸出陳述句
* >隨著物件的創建而執行,每創建一個物件就執行一次
* >作用:可以在創建物件的時候,對物件的屬性等進行初始化
* >如果一個類中定義了多個非靜態代碼塊,則按照宣告先后順序執行
* >非靜態代碼塊內可以呼叫靜態屬性、靜態方法,或非靜態的屬性,非靜態的方法
*/
public class Bank {
public static void main(String args[]){
String n = Person.des;
}
}
class Person{
//屬性
private String name;
private int age;
static String des = "hhh";
//構造器
public Person(){
}
public Person(String name,int age){
this.age=age;
this.name=name;
}
//非靜態代碼塊
{
name ="無名";
System.out.println(222);
//呼叫靜態方法
eat();
//呼叫非靜態方法
walk();
}
//靜態代碼塊
static {
System.out.println(111);
des = "www";
eat();
}
public static void eat(){
System.out.println("吃吃吃");
}
public void walk(){
System.out.println("肘,跟我進屋");
}
}
代碼塊使用場景:
- 比如資料庫連接池,只需要創建一個池子,使用靜態代碼塊保證執行一次
對屬性可以賦值的順序:
- 默認初始化
- 顯示初始化/在代碼塊中賦值
- 構造器中初始化
- 有了物件后,通過“物件.屬性”或"物件.方法"進行賦值
final關鍵字
final的使用
final:最終的
1、final可以修飾的結構:類、方法、變數2、final修飾一個類:此類不能被其他類所繼承
比如:String類、System類、StringBuffer類3、final修飾方法:表明此方法不能再被重寫
比如Object中的getClass()方法4、final修飾變數:此時"變數"就是一個常量
4.1final修飾屬性:可以考慮賦值的位置有:顯示初始化、代碼塊中初始化、構造器中初始化
修飾變數一定是要在類被加載之前被賦值
4.2final修飾區域變數:
尤其是使用final修飾形參時,表明此形參是一個常量,當我們呼叫此方法時,給常量形參賦一個實參,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/549263.html
標籤:Java
