『壹』 java局部變數和全局變數的區別
局部變數在方法告山內部聲明,並且只能在方法內部使用,在外層的方法被調用時被分配內存,請求在方法執行完畢後自動釋放內存而消亡,在使用局部變數的時候必須先對其進行初初始化。它是在方法體中定義的變數以及方法的參數,只在定義它的方法內有效。
全局變數也叫成員變數,是指在類中定義的變數;它在整個類中都有效,又可分為類變數和實例變數。類變數又叫靜態變消拆量,用static修飾 它可以直接用類名調用,也可以用對象調用 ,而且所有對象的同一個類變數都是共享同一塊內存空間的。實例變拿友棗量不用static修飾,它只能通過對象調用,而且所有對象的同一個實例變數是共享不同的內存空間的。
『貳』 java中的全局變數和靜態變數是在編譯時分配內存還是在載入時分配內存
全局變數 ( 成員變數 )是在創建對象的時候分配內存的 創建對象過程為 1 分配空間 2 遞歸的創建父類對象(無父類這步可省略) 3 初始化成員變數 4 調用構造方法創建一個對象
靜態變數是在類載入的時候分配空間的,靜態變數和對象沒有關系 是在JVM第一次讀到一個類的時候載入信息的過程中分配空間的 類載入過程為 1 載入父類(如果父類已經載入過,則不在載入)2初始化靜態屬性 3 按順序的初始化靜態代碼塊
初始化的前提就是分配空間
而且靜態變數在以後的創建對象的時候不在初始化 所以一般用靜態來保存共享信息
希望對你有所幫助
『叄』 java中static作用是什麼
static表示「全局」或者「靜態」的意思,用來修飾成員變數和成員方法,也可以形成靜態static代碼塊,但是Java語言中沒有全局變數的概念。
被static修飾的成員變數和成員方法獨立於該類的任何對象。也就是說,它不依賴類特定的實例,被類的所有實例共享。
只要這個類被載入,Java虛擬機就能根據類名在運行時數據區的方法區內定找到他們。因此,static對象可以在它的任何對象創建之前訪問,無需引用任何對象。
用public修飾的static成員變數和成員方法本質是全局變數和全局方法,當聲明它類的對象市,不生成static變數的副本,而是類的所有實例共享同一個static變數。
static變數前可以有private修飾,表示這個變數可以在類的靜態代碼塊中,或者類的其他靜態成員方法中使用(當然也可以在非靜態成員方法中使用--廢話),但是不能在其他類中通過類名來直接引用,這一點很重要。實際上你需要搞明白,private是訪問許可權限定,static表示不要實例化就可以使用,這樣就容易理解多了。static前面加上其它訪問許可權關鍵字的效果也以此類推。
static修飾的成員變數和成員方法習慣上稱為靜態變數和靜態方法,可以直接通過類名來訪問,訪問語法為:
類名.靜態方法名(參數列表...)
類名.靜態變數名
用static修飾的代碼塊表示靜態代碼塊,當Java虛擬機(JVM)載入類時,就會執行該代碼塊(用處非常大,呵呵)。
1、static變數
按照是否靜態的對類成員變數進行分類可分兩種:一種是被static修飾的變數,叫靜態變數或類變數;另一種是沒有被static修飾的變數,叫實例變數。
兩者的區別是:
對於靜態變數在內存中只有一個拷貝(節省內存),JVM只為靜態分配一次內存,在載入類的過程中完成靜態變數的內存分配,可用類名直接訪問(方便),當然也可以通過對象來訪問(但是這是不推薦的)。
對於實例變數,沒創建一個實例,就會為實例變數分配一次內存,實例變數可以在內存中有多個拷貝,互不影響(靈活)。
所以一般在需要實現以下兩個功能時使用靜態變數:
在對象之間共享值時
方便訪問變數時
2、靜態方法
靜態方法可以直接通過類名調用,任何的實例也都可以調用,
因此靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的實例變數和實例方法(就是不帶static的成員變數和成員成員方法),只能訪問所屬類的靜態成員變數和成員方法。
因為實例成員與特定的對象關聯!這個需要去理解,想明白其中的道理,不是記憶!!!
因為static方法獨立於任何實例,因此static方法必須被實現,而不能是抽象的abstract。
例如為了方便方法的調用,Java API中的Math類中所有的方法都是靜態的,而一般類內部的static方法也是方便其它類對該方法的調用。
靜態方法是類內部的一類特殊方法,只有在需要時才將對應的方法聲明成靜態的,一個類內部的方法一般都是非靜態的
3、static代碼塊
static代碼塊也叫靜態代碼塊,是在類中獨立於類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內,JVM載入類時會執行這些靜態的代碼塊,如果static代碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個代碼塊只會被執行一次。例如:
public class Test5 {
private static int a;
private int b;
static{
Test5.a=3;
System.out.println(a);
Test5 t=new Test5();
t.f();
t.b=1000;
System.out.println(t.b);
}
static{
Test5.a=4;
System.out.println(a);
}
public static void main(String[] args) {
// TODO 自動生成方法存根
}
static{
Test5.a=5;
System.out.println(a);
}
public void f(){
System.out.println("hhahhahah");
}
}
運行結果:
3
hhahhahah
1000
4
5
利用靜態代碼塊可以對一些static變數進行賦值,最後再看一眼這些例子,都一個static的main方法,這樣JVM在運行main方法的時候可以直接調用而不用創建實例。
4、static和final一塊用表示什麼
static final用來修飾成員變數和成員方法,可簡單理解為「全局常量」!
對於變數,表示一旦給值就不可修改,並且通過類名可以訪問。
對於方法,表示不可覆蓋,並且可以通過類名直接訪問。
有時你希望定義一個類成員,使它的使用完全獨立於該類的任何對象。通常情況下,類成員必須通過它的類的對象訪問,但是可以創建這樣一個成員,它能夠被它自己使用,而不必引用特定的實例。在成員的聲明前面加上關鍵字static(靜態的)就能創建這樣的成員。如果一個成員被聲明為static,它就能夠在它的類的任何對象創建之前被訪問,而不必引用任何對象。你可以將方法和變數都聲明為static。static 成員的最常見的例子是main( ) 。因為在程序開始執行時必須調用main() ,所以它被聲明為static。
聲明為static的變數實質上就是全局變數。當聲明一個對象時,並不產生static變數的拷貝,而是該類所有的實例變數共用同一個static變數。聲明為static的方法有以下幾條限制:
•
它們僅能調用其他的static 方法。
•
它們只能訪問static數據。
•
它們不能以任何方式引用this 或super(關鍵字super 與繼承有關,在下一章中描述)。
如果你需要通過計算來初始化你的static變數,你可以聲明一個static塊,Static 塊僅在該類被載入時執行一次。下面的例子顯示的類有一個static方法,一些static變數,以及一個static 初始化塊:
// Demonstrate static variables,methods,and blocks.
class UseStatic {
static int a = 3;
static int b;
static void meth(int x) {
System.out.println("x = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
static {
System.out.println("Static block initialized.");
b = a * 4;
}
public static void main(String args[]) {
meth(42);
}
}
一旦UseStatic 類被裝載,所有的static語句被運行。首先,a被設置為3,接著static 塊執行(列印一條消息),最後,b被初始化為a*4 或12。然後調用main(),main() 調用meth() ,把值42傳遞給x。3個println ( ) 語句引用兩個static變數a和b,以及局部變數x 。
注意:在一個static 方法中引用任何實例變數都是非法的。
下面是該程序的輸出:
Static block initialized.
x = 42
a = 3
b = 12
在定義它們的類的外面,static 方法和變數能獨立於任何對象而被使用。這樣,你只要在類的名字後面加點號運算符即可。例如,如果你希望從類外面調用一個static方法,你可以使用下面通用的格式:
classname.method( )
這里,classname 是類的名字,在該類中定義static方法。可以看到,這種格式與通過對象引用變數調用非static方法的格式類似。一個static變數可以以同樣的格式來訪問——類名加點號運算符。這就是Java 如何實現全局功能和全局變數的一個控製版本。
下面是一個例子。在main() 中,static方法callme() 和static 變數b在它們的類之外被訪問。
class StaticDemo {
static int a = 42;
static int b = 99;
static void callme() {
System.out.println("a = " + a);
}
}
class StaticByName {
public static void main(String args[]) {
StaticDemo.callme();
System.out.println("b = " + StaticDemo.b);
}
}
下面是該程序的輸出:
a = 42
b = 99
static成員是不能被其所在class創建的實例訪問的。
如果不加static修飾的成員是對象成員,也就是歸每個對象所有的。
加static修飾的成員是類成員,就是可以由一個類直接調用,為所有對象共有的
『肆』 java中的全局變數和靜態變數是在編譯時分配內存還是在載入時分配內存
全局扮閉戚變數是在創建對象的時候分配內存的 創建對象過程為
分配空間。
遞歸的創建父類對象。
初始化成員變數。
調用構造方法創建一個對象。
靜態變數是在類載入的時候分配空間的,靜態變數和對象沒有關系 是在JVM第一次讀到一個類的時候載入信息的過程中分配空間的 載入過程為
1 .載入父類(如果父類已經載入過,則不在載入)。
2.初始化靜態屬性 。
3 .按順序的初始化靜態代碼塊 初始化的前提就是分配空間 。
而且靜態變數在以後的創建對象的時候不在初始化 所以一般用靜態來保存共享信息
『伍』 java 全局變數的值可以改變嗎
如果全局變數的類型是「public
static
final」的,那麼變數的值是不會被改變的;
如果全局變數的類型是「public
static
」的,那麼變數的值是可以被隨意改變的;
解釋:在java中final變數表示的是最終的,也就是在程序初始化載入到內存中,之後不可以被任何對象修改,如果沒被定義為final的話,可以重新賦值的。