一、final、statichtml
final修飾類,類不能被繼承java
final修飾方法,禁止該方法在子類中被覆蓋 把該方法鎖定。dom
final修飾變量,經常使用,其數值一旦被初始化不能再修改。若是是引用類型的變量,初始化後便不能再指向另外一個對象。jvm
當用final做用於類的成員變量時,成員變量(注意是類的成員變量,局部變量只須要保證在使用以前被初始化賦值便可)必須在定義時或者構造器中進行初始化賦值,並且final變量一旦被初始化賦值以後,就不能再被賦值了。函數
引用變量被final修飾以後,雖然不能再指向其餘對象,可是它指向的對象的內容是可變的。優化
public class Test { public static void main(String[] args) { final MyClass myClass = new MyClass(); System.out.println(++myClass.i); } } class MyClass { public int i = 0; }
輸出1spa
final使用場景htm
在方法參數前面加final關鍵字就是爲了防止數據在方法體中被修改。這裏主要分兩種狀況:第一,用final修飾基本數據類型;第二,用final修飾引用類型。
第一種狀況,修飾基本類型(非引用類型)。這時參數的值在方法體內是不能被修改的,即不能被從新賦值。不然編譯就通不過。例如:
public void testInt(final int param1) {
param1 = 100;
}
在方法體內修改了基本數據類型變量的值,在Eclipse中則會提示:「 The final local variable param1 cannot be assigned. It must be blank and not using a compound assignment.「
第二種狀況,修飾引用類型。這時參數變量所引用的對象是不能被改變的。做爲引用的拷貝,參數在方法體裏面不能再引用新的對象。不然編譯通不過。例如:
public void testFinal2(final Object param2) {
param2 = new Object();
}
在方法體內修改了參數的引用,在Eclipse中則會提示:「 The final local variable param2 cannot be assigned. It must be blank and not using a compound assignment.「
static對象
用public修飾的static成員變量和成員方法本質是全局變量和全局方法,當聲明它類的對象時,不生成static變量的副本,而是類的全部實例共享同一個static變量。
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();
輸出結果:blog
0.08514268139173864
0.4449156699153448
0.86659777969746
0.4449156699153448
由於j是static修飾的變量,一個類只有一份,故不變
匿名內部類中使用的外部局部變量爲何只能是final變量? 見 http://www.cnblogs.com/dolphin0520/p/3811445.html
public class Test { public static void main(String[] args) { String a = "hello2"; final String b = "hello"; String d = "hello"; String c = b + 2; String e = d + 2; System.out.println((a == c)); System.out.println((a == e)); } }
第一個比較結果爲true,而第二個比較結果爲fasle。這裏面就是final變量和普通變量的區別了,當final變量是基本數據類型以及String類型時,若是在編譯期間能知道它的確切值,則編譯器會把它當作編譯期常量使用。也就是說在用到該final變量的地方,至關於直接訪問的這個常量,不須要在運行時肯定。這種和C語言中的宏替換有點像。所以在上面的一段代碼中,因爲變量b被final修飾,所以會被當作編譯器常量,因此在使用到b的地方會直接將變量b 替換爲它的 值。而對於變量d的訪問卻須要在運行時經過連接來進行。想必其中的區別你們應該明白了,不過要注意,只有在編譯期間能確切知道final變量值的狀況下,編譯器纔會進行這樣的優化,好比下面的這段代碼就不會進行優化:
三、java中==、equals區別
byte,short,char,int,long,float,double,boolean 他們之間的比較,應用雙等號(==),比較的是他們的值。
當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,因此,除非是同一個new出來的對象,他們的比較後的結果爲true,不然比較後結果爲false。JAVA當中全部的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行爲是比較對象的內存地 址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現,而再也不是比較類在堆內存中的存放地址了。 對於複合數據類型之間進行equals比較,在沒有覆寫equals方法的狀況下,他們之間的比較仍是基於他們在內存中的存放位置的地址值的,由於Object的equals方法也是用雙等號(==)進行比較的,因此比較後的結果跟雙等號(==)的結果相同。
四、java中String類型
public class TestString { public static void main(String[] args) { String s1 ="Monday"; String s2 =new String("Monday"); if (s1 == s2) {System.out.println("s1 == s2"); } else { System.out.println("s1 != s2"); } if (s1.equals(s2)) { System.out.println("s1 equals s2"); } else { System.out.println("s1 not equals s2"); } } }
String字符串緩衝池中,
java 中String是 immutable的,也就是不可變,一旦初始化,引用指向的內容是不可變的(注意:是內容不可變)。
原來,程序在運行的時候會建立一個字符串緩衝池當使用 s2 = "Monday" 這樣的表達是建立字符串的時候,程序首先會在這個String緩衝池中尋找相同值的對象,在第一個程序中,s1先被放到了池中,因此在s2被建立的時候,程序找到了具備相同值的 s1 將s2引用s1所引用的對象"Monday" 第二段程序中,使用了 new 操做符,他明白的告訴程序:"我要一個新的!不要舊的!"因而一個新的"Monday"Sting對象被建立在內存中。他們的值相同,可是位置不一樣,一個在池中游泳一個在岸邊休息。哎呀,真是資源浪費,明明是同樣的非要分開作什麼呢?
java中String == 和equal區別 https://www.cnblogs.com/studyLog-share/p/5307913.html
二、public、private、protected
在說明這四個關鍵字以前,我想就class之間的關係作一個簡單的定義,對於繼承本身的class,base class能夠認爲他們都是本身的子女,而對於和本身一個目錄下的classes,認爲都是本身的朋友。一、public:public代表該數據成員、成員函數是對全部用戶開放的,全部用戶均可以直接進行調用二、private:private表示私有,私有的意思就是除了class本身以外,任何人都不能夠直接使用,私有財產神聖不可侵犯嘛,即使是子女,朋友,都不可使用。三、protected:protected對於子女、朋友來講,就是public的,能夠自由使用,沒有任何限制,而對於其餘的外部class,protected就變成private。做用域 當前類 同一package 子孫類 其餘packagepublic √ √ √ √protected √ √ √ ×friendly √ √ × ×private √ × × ×注:不寫時默認爲friendly