關鍵詞

一、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的,也就是不可變,一旦初始化,引用指向的內容是不可變的(注意:是內容不可變)。

也就是說,假設代碼中有String str = 「aa」;str=「bb」;,則第二條語句不是改變「aa」原來所在存儲地址中的內容,而是另外開闢了一個空間用來存儲「bb」;同時因爲str原來指向的「aa」如今已經不可達,jvm會經過GC自動回收。

 原來,程序在運行的時候會建立一個字符串緩衝池當使用 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

相關文章
相關標籤/搜索