面向對象(2)
this:代表對象。代表哪個對象呢?當前對象。
當成員變數和局部變數重名,可以用關鍵字this來區分。
this就是所在函數所屬物件的參考。 (簡單說:哪個物件呼叫了this所在的函數,this就代表哪個物件。)
this也可以用來在建構子中呼叫其他建構子。注意:只能定義在建構函數的第一行。因為初始化動作要先執行。
例如:person(String name){this.name = name;}
到了本類的對象,通常都是用this。
static:
特點:1.static是一個修飾符,用來修飾成員。
2.static修飾的成員為所有的物件所共享的。
3. static優先於物件存在,因為static的成員隨著類別的載入就已經存在了。
4.static修飾的成員多了一種調用方式,就是可以直接被類別名稱所調用,如:類別名稱.成員變數。
5.static修飾的資料是共享數據,且物件中的儲存的時特有資料。
注意:成員變數也稱為實例變數;static修飾的變數稱為靜態變數或叫類變數。
成員變數與靜態變數的差異:
1.兩個變數的生命週期不同。
成員變數隨著物件的創建而存在,隨著物件的回收而被回收和釋放;
靜態變數隨著類別的載入而存在,隨著類別的消失而消失。
2.呼叫方式不同。
成員變數只能被物件調用;
靜態變數可以被物件調用,也可以被類別名稱調用(建議)。
3.別名不同。
成員變數稱為實例變數;
靜態變數稱為類別變數。
4.資料儲存位置不同。
成員變數資料儲存在堆記憶體的物件中,所以也叫物件的特有資料。
靜態變數資料儲存在方法區(共用資料區)的靜態區,所以也叫物件的共用資料。
靜態使用的注意事項:
1.靜態方法只能存取靜態成員。 (非靜態既可以存取靜態,又可以存取非靜態)(說明:注意此處針對同一個類別的環境下,靜態方法只能呼叫本類別中的靜態成員)
2.靜態方法中不可以使用this或者super關鍵字。
3.主函數是靜態的。
靜態什麼時候用?
1.靜態變數。
當分析對像中所具備的成員變數都是相同的,這時這個成員變數可以被靜態修飾。
只要數據在物件中都是不同的,那就是物件的特有數據,必須儲存在物件中,是非靜態的。
如果是相同的數據,物件不需要做修改,只需要使用即可,不需要儲存在物件中,定義成靜態的。
2.靜態函數。
函數是否以靜態修飾,只要參考一點,就是該函數功能是否有存取到物件中的特有資料。
簡單點說,從原始碼看,該功能是否需要存取非靜態的成員變量,如果需要,該功能就是非靜態的,如果不需要,就可以將功能定義為靜態的。
當然,也可以將該功能定義成非靜態,但是非靜態需要被對象調用,而僅創建對象調用非靜態的沒有訪問特有數據的方法,該對象的創建時沒有意義的。
主函數特殊之處:
1.格式是固定的;2.被jvm所識別和調用。
public:因為權限必須是最大的。
static:不需要物件的,直接用主函數所屬類別名稱呼叫即可。
void:主函數沒有特定的回傳值。
main:函數名,不是關鍵字,只是一個jvm識別的固定的名字。
String[] args:這是主函數的參數列表,是一個陣列類型的參數,而且元素都是字串類型。 (可在呼叫主函數時傳入,例如:java mainDemo xx yy zz 即為傳入了3個元素的字串陣列)
靜態程式碼區塊建構程式碼區塊局部程式碼區塊:
靜態程式碼區塊:隨著類別的載入而執行。而且只執行一次。作用:用於給類別進行初始化。
建構程式碼區塊:隨著物件的建立而執行,物件建立幾次即呼叫幾次。作用:可以給所有物件初始化的。 (與建構子的區別:建構子是給對應的物件進行針對性的初始化。而建構程式碼區塊物件初始化的通用性。)
局部程式碼區塊的作用:限定局部變數的生命週期。
三者的呼叫順序如下:
class StaticCode { static int num ; //静态代码块 (首先执行) static { num = 10; // num *=3; System.out.println("hahahah"); } StaticCode(){} static void show() { System.out.println(num); } } class Person { private String name; {//构造代码块。可以给所有对象进行初始化的。(如有调用对象,即其次调用,与局部代码块视情况而定) System.out.println("constructor code "); // cry(); } static { System.out.println("static code"); } Person()//是给对应的对象进行针对性的初始化。 { name = "baby"; // cry(); } Person(String name) { this.name = name; // cry(); } public void cry() { System.out.println("哇哇"); } public void speak() { System.out.println("name:"+name); } static void show() { System.out.println("show run"); } } class StaticCodeDemo { static { // System.out.println("a"); //先执行 } public static void main(String[] args) { // Person p = null; // p.speak(); // Person.show(); // Person p1 = new Person(); // p1.speak(); // Person p2 = new Person("旺财"); // p2.speak(); // new Person(); // new StaticCode().show(); // new StaticCode().show(); // StaticCode.show(); // System.out.println("b"); //后执行 } }
以上就是Java 基礎入門隨筆(8) JavaSE版-靜態static的內容,更多相關內容請關注PHP中文網(www.php.cn)!