function test(){
var a = b = 10;
}
test( );
alert(b);
由上一篇博客說起,最后輸出的是10。引起歧義的原因是全局變量和局部變量的關系。順着這個話題,說說java中的這塊兒。總--分--總結構來敘述一下。
參考博客:
總:java中沒有全局變量這個概念,只有局部變量和成員變量兩個說法。
java中沒有“全局變量”的概念。而是有“靜態”這個概念。
1.static 修飾成員變量。
2.static 修飾成員方法。
3.static 修飾靜態代碼塊。
被static修飾的成員變量和成員方法獨立於該類的任何對象。即它不依賴於類的實例,被類的所有實例共享。
只要這個類被加載,Java虛擬機就能根據類名在運行時數據區的方法區內找到他們。因此,static對象可以
在它的任何對象之前訪問,無需應用任何對象。
a.
接下來,對比final。
Java.lang.String類不可以被繼承,由於它被final所修飾。
1.final 修飾類;
2.final 修飾方法;
3.final 修飾變量(成員變量和局部變量)。
final修飾類,類不能夠被繼承,String類就是這種情況。final修飾方法,把方法鎖定,防止繼承它的類來修改它的含義。
final修飾變量,分為修飾基本數據類型變量和應用類型變量。基本數據類型的變量修飾之后不能改值;引用類型的變量初始化
之后不能再指向另外一個對象,但是可以改變當前對象的內容。
眾說紛紜:
1. (全民財富)在static方法內部不能調用非靜態方法,反過來是可以的。
2. static目的是,方便在沒有創建對象的情況下來進行調用(方法/變量)。被static關鍵字修飾的方法或者變量不需要依賴於對象來進行訪問,只要類被加載了,就可以通過類名去進行訪問。
3. 對於靜態方法來說,是沒有this的,因為它不依附於任何對象,既然都沒有對象,就談不上this了。
4. 在靜態方法中不能訪問類的非靜態成員變量和非靜態成員方法,因為非靜態成員方法/變量都是必須依賴具體的對象才能夠被調用。
5. 在靜態方法中不能訪問非靜態成員方法和非靜態成員變量,但是在非靜態成員方法中是可以訪問靜態成員方法/變量的。
6. 即使沒有顯示地聲明為static,類的構造器實際上也是靜態方法。但是為什么構造方法中?還可以用this來訪問成員變量呢??博客
補充:靜態成員變量雖然獨立於對象,但是不代表不可以通過對象去訪問,所有的靜態方法和靜態變量都可以通過對象訪問(只要訪問權限足夠)。
7. 靜態變量和非靜態變量的區別是:靜態變量被所有的對象所共享,在內存中只有一份兒,它當且僅當在類初次加載時會被初始化,由JVM對它初始化。而非靜態變量是對象所擁有的,在創建對象的時候被初始化,存在多份兒,各個對象擁有的份兒互不影響。
8. static代碼塊,用來優化程序的性能。當類初次被加載的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。(只會在類加載的時候執行一次)
9. 在Java中切記:static是不允許用來修飾局部變量。不要問為什么,這是Java語法的規定。
10. Java中的String類就是一個final類。
11. 當用final修飾一個類時,表明這個類不能被繼承。要注意final類中的所有成員方法都會被隱式地指定為final方法。
12. 對於一個final變量,如果是基本數據類型的變量,則其數值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對其初始化之后便不能再讓其指向另一個對象。
13. 被final修飾的引用變量一旦初始化賦值之后就不能再指向其他的對象,那么該引用變量指向的對象的內容是可變的。
14. 很多時候會容易把static和final關鍵字混淆,static作用於成員變量用來表示只保存一份兒,而final的作用是用來保證變量不可變。
public class Test {
public static void main(String[] args) {
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
System.out.println(myClass1.i);
System.out.println(myClass1.j);
System.out.println(myClass2.i);
System.out.println(myClass2.j);
}
}
class MyClass {
public final double i = Math.random();
public static double j = Math.random();
}
運行這段代碼就會發現,每次打印的兩個j值都是一樣的,而i的值卻是不同的。從這里就可以知道final和static變量的區別了。
Java基礎:
算法: