1. 程式人生 > >1.成員變數&全域性變數&區域性變數&靜態變數、常量和方法

1.成員變數&全域性變數&區域性變數&靜態變數、常量和方法

原文:https://blog.csdn.net/panpuqin/article/details/75091468 

原文:https://blog.csdn.net/bobo_993/article/details/73655765 

@interface Person : NSObject  
{  
    // 成員變數:  
    // 寫在類宣告的大括號中的變數, 我們稱之為 成員變數(屬性, 例項變數)  
    // 成員變數只能通過物件來訪問  
    // 注意: 成員變數不能離開類, 離開類之後就不是成員變數 成員變數不能在定義的同時進行初始化  
    // 儲存: 堆(當前物件對應的堆的儲存空間中)  
    // 儲存在堆中的資料, 不會被自動釋放, 只能程式設計師手動釋放  
    int age;  
}  
@end  
  
@implementation Person  
  
  
@end  
  
// 全域性變數:  
// 寫在函式和大括號外部的變數, 我們稱之為全域性變數  
// 作用域: 從定義的那一行開始, 一直到檔案末尾  
// 全域性變數可以先定義在初始化, 也可以定義的同時初始化  
// 儲存: 靜態區  
// 程式一啟動就會分配儲存空間, 直到程式結束才會釋放  
int a;  
int b = 10;  
  
int main(int argc, const charchar * argv[]) {  
    // 區域性變數:  
    // 寫在函式或者程式碼塊中的變數, 我們稱之為區域性變數  
    // 作用域: 從定義的那一行開始, 一直到遇到大括號或者return  
    // 區域性變數可以先定義再初始化, 也可以定義的同時初始化  
    // 儲存 : 棧  
    // 儲存在棧中的資料有一個特點, 系統會自動給我們釋放  
    int num = 10;  
    {  
        int value;  
    }  
    return 0;  
}  

補充:

靜態成員變數值是所有類的例項共享的,所以呼叫的時候只需要  類名.屬性名  就可呼叫(也只能這樣呼叫),而非靜態成員變數的值是各個例項私有的,所以呼叫的時候必須是先有具體的類的例項,然後通過例項名來呼叫。也就是說,static修飾的成員,大家用的時候都用的一個東西,一個人改動後,大家的都變了。而非static 修飾的成員是個人私有的,允許自己修改,每個人的都不一樣。

所以在編碼中,我們一般為static 變數加一個final,就是為了變數的一致性,不允許某個例項對它進行修改。這也解釋了為什麼不能在靜態的方法中呼叫非靜態的成員(變數或方法),因為靜態方法不需要例項化就可呼叫,如果此時呼叫非靜態的成員,不能確定類是否已被例項化,被呼叫的成員是否存在(非靜態成員是在類被例項化,建立具體物件時才分配空間)。

而靜態成員在類載入完成的時候就已經分配完空間,所以實際存在,可以被static方法呼叫。

從生命週期上看:

靜態成員:  在類載入的時候,類載入完成,就分配完空間;直到類被解除安裝時空間被回收

 非靜態成員: 建立物件的時候分配空間; 物件變為垃圾空間被回收的時候被銷燬

static修飾的變數、常亮和方法被稱為靜態變數、常量和方法。

被宣告為static的變數、常量和方法被稱為靜態成員。靜態成員屬於類所有,區別於個別物件,以在本類或其他類類使用類名和“.” 運算子呼叫靜態成員。

package javademo;
 
public class StaticTest {
	static double PI = 3.14; //在類中定義靜態變數
	static int id; //咋類中定義靜態變數
	public static void method1(){ //靜態方法
		//doSomething
		id = 2;
		System.out.println("1");
	}
	public void method2(){//例項方法
		method1();
		System.out.println(StaticTest.PI);//呼叫靜態變數
		System.out.println(id);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		StaticTest test = new StaticTest();
		test.method2();
		method1();
	}
 
}

 

雖然靜態成員也可以使用“”物件.靜態成員”的形式進行呼叫,但通常不推薦用這樣的形式,因為這樣容易混淆靜態成員和非靜態成員。
靜態資料與靜態方法的作用通常是為了提供共享資料方法,直接使類名呼叫靜態成員即可。

在靜態方法中不能使用this關鍵字。

在靜態方法中不可以直接呼叫非靜態方法。