static關鍵字,main()方法,代碼塊,final關鍵字 static關鍵字的使用: static:靜態的 static可以修飾:屬性、方法、代碼塊、內部類 使用static修飾的變數:靜態變數(類變數) 3.1屬性: *實例變數:*我們創建了多個類的對象,每個對象都擁有一套獨立的類的非靜態屬 ...
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修飾形參時,表明此形參是一個常量。當我們調用此方法時,給常量形參賦一個實參。