static:靜態的
1.可以用來修飾的結構:主要用來修飾類的內部結構
屬性、方法、代碼塊、內部類
2.static修飾屬性:靜態變量(或類變量)
2.1 屬性,是否使用static修飾,又分為:靜態屬性 vs 非靜態屬性(實例變量)
-
實例變量:我們創建了類的多個對象,每個對象都獨立的擁一套類中的非靜態屬性。當修改其中一個對象中的非靜態屬性時,不會導致其他對象中同樣的屬性值的修改。
-
靜態變量:我們創建了類的多個對象,多個對象共享同一個靜態變量。當通過某一個對象修改靜態變量時,會導致其他對象調用此靜態變量時,是修改過了的。
-
2.2 static修飾屬性的其他說明:
-
① 靜態變量隨著類的加載而加載。可以通過"類.靜態變量"的方式進行調用
-
② 靜態變量的加載要早于對象的創建。
-
③ 由于類只會加載一次,則靜態變量在內存中也只會存在一份:存在方法區的靜態域中。
-
④ 類變量 實例變量
-
類 yes no
-
對象 yes yes
-
2.3 靜態屬性舉例:System.out; Math.PI;
3.靜態變量內存解析:
4.static修飾方法:靜態方法、類方法
① 隨著類的加載而加載,可以通過"類.靜態方法"的方式進行調用
② 靜態方法 非靜態方法
-
類 yes no
-
對象 yes yes
③ 靜態方法中,只能調用靜態的方法或屬性
非靜態方法中,既可以調用非靜態的方法或屬性,也可以調用靜態的方法或屬性
5. static的注意點:
5.1 在靜態的方法內,不能使用this關鍵字、super關鍵字
5.2 關于靜態屬性和靜態方法的使用,大家都從生命周期的角度去理解。
6.如何判定屬性和方法應該使用static關鍵字:
6.1 關于屬性
屬性是可以被多個對象所共享的,不會隨著對象的不同而不同的。
類中的常量也常常聲明為static
6.2 關于方法
操作靜態屬性的方法,通常設置為static的
工具類中的方法,習慣上聲明為static的。 比如:Math、Arrays、Collections
7.使用舉例:
舉例一:Arrays、Math、Collections等工具類
舉例二:單例模式
舉例三:
class Circle{
private double radius;
private int id;//自動賦值public Circle(){id = init++;total++;
}public Circle(double radius){this();
// id = init++;
// total++;
this.radius = radius;
}private static int total;//記錄創建的圓的個數
private static int init = 1001;//static聲明的屬性被所對象所共享public double findArea(){return 3.14 * radius * radius;
}public double getRadius() {return radius;
}public void setRadius(double radius) {this.radius = radius;
}public int getId() {return id;
}public static int getTotal() {return total;
}
}
1.設計模式的說明
1.1 理解
設計模式是在大量的實踐中總結和理論化之后優的代碼結構、編程風格、以及解決問題的思考方式。
1.2 常用設計模式 — 23種經典的設計模式 GOF
創建型模式,共5種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
結構型模式,共7種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
行為型模式,共11種:策略模式、模板方法模式、觀察者模式、迭代器模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
2.單例模式
2.1 要解決的問題:
所謂類的單例設計模式,就是采取一定的方法保證在整個的軟件系統中,對某個類只能存在一個對象實例。
2.2 具體代碼的實現:
餓漢式1:
class Bank{
//1.私化類的構造器
private Bank(){}//2.內部創建類的對象
//4.要求此對象也必須聲明為靜態的
private static Bank instance = new Bank();//3.提供公共的靜態的方法,返回類的對象
public static Bank getInstance(){return instance;
}
}
餓漢式2:使用了靜態代碼塊
class Order{
//1.私化類的構造器
private Order(){}//2.聲明當前類對象,沒初始化
//4.此對象也必須聲明為static的
private static Order instance = null;static{instance = new Order();
}
//3.聲明public、static的返回當前類對象的方法
public static Order getInstance(){return instance;
}
}
懶漢式:
class Order{
//1.私化類的構造器
private Order(){ }
//2.聲明當前類對象,沒初始化
//4.此對象也必須聲明為static的
private static Order instance = null;
//3.聲明public、static的返回當前類對象的方法
public static Order getInstance(){if(instance == null){instance = new Order();}return instance;
}
}
2.3 兩種方式的對比:
- 餓漢式:
-
壞處:對象加載時間過長。
-
好處:餓漢式是線程安全的
-
懶漢式:好處:延遲對象的創建。
-
目前的寫法壞處:線程不安全。--->到多線程內容時,再修改
main()方法作為程序的入口
main()方法也是一個普通的靜態方法
main()方法可以作為我們與控制臺交互的方式。(之前:使用Scanner)
如何將控制臺獲取的數據傳給形參:String[] args?
運行時:java 類名 “Tom” “Jerry” “123” “true”
sysout(args[0]);//“Tom”
sysout(args[3]);//“true” -->Boolean.parseBoolean(args[3]);
sysout(args[4]);//報異常
小結:一葉知秋
public static void main(String[] args){//方法體}
權限修飾符:private 缺省 protected pubilc ---->封裝性
修飾符:static \ final \ abstract \native 可以用來修飾方法
返回值類型: 無返回值 / 有返回值 -->return
方法名:需要滿足標識符命名的規則、規范;“見名知意”
形參列表:重載 vs 重寫;參數的值傳遞機制;體現對象的多態性
方法體:來體現方法的功能
main(){
Person p = new Man();
p.eat();
//p.earnMoney();
Man man = new Man();
man.eat();
man.earnMoney();
}