Java關鍵字學習總結

1.   abstract(抽象)java

用法:類修飾符的一種,能夠用來修飾類,方法,被修飾的類不可以實例化(即不能用new關鍵字獲得對象),被修飾的方法不可以實現。一個抽象類中不必定要有抽象方法,可是一個類裏面有抽象方法就必定是抽象類。若是由類要繼承抽象類的話,必需要實現裏面的抽象方法。構造方法和靜態方法不能夠修飾爲抽象。node

例子:數組

       public abstract class Animal {併發

              public abstract void cry();異步

              public void run(){ide

                     System.out.println(「跑的方法……」);函數

}oop

}優化

abstract關鍵字能夠修改類或方法。this

abstract類能夠擴展(增長子類),但不能直接實例化。

abstract方法不在聲明它的類中實現,但必須在某個子類中重寫

-示例-

public abstract  class  MyClass{}

public abstract  StringmyMethod();

採用abstract方法的類原本就是抽象類,而且必須聲明爲abstract。abstract類不能實例化。

僅當abstract類的子類實現其超類的全部abstract方法時,才能實例化abstract類的子類。這種類稱爲具體類,以區別於abstract類 。

final 類的方法都不能是 abstract,由於 final 類不能有子類。

< 1> abstract抽象用在類的聲明中來指明一個類是不能被實例化的,可是能夠被其餘類繼承。一個抽象類可使用抽象方法,抽象方法不須要實現,可是須要在子類中被實現。它的用途是向子類提供通用的信息。抽象類能夠包含正常的類包含的任何東西,也就是說,類和實例變量,以及帶有任何修飾詞的方法。只有抽象類可能有抽象方法。若是一個不是抽象的類包含一個抽象方法,那麼將會出現編譯錯誤。 
例子:若是下列的一個成立,那麼一個有抽象方法:

 a.它顯式的聲明瞭一個abstract方法。

 b.它從它的直接父類繼承了一個抽象方法。 
c.一個直接的類的父藉口聲明或繼承了它的一個方法(這所以必須是abstract) 

<2>若是用戶聲明private,static,和final方法爲abstarct,編譯錯誤將出現。

不可能重設一個private方法,由於一個abstarct  private永遠不能被實現。

static方法老是可用的,所以必須有一個實現;static abstract將永遠沒有實現。

final方法不能被重設,所以不回有final abstract方法的實現。

 

2.extends 解釋:擴充,擴展 
用法:一個類繼承另外一個類的關鍵字,當出現了這個關鍵字,兩個類就有了繼承關係,extends前面的類,咱們稱之爲父類。

extends後面的類,咱們稱之爲子類。有了繼承關係以後,咱們就說子類擁有父類繼承下來的全部非私有的成員(包括了屬性,方法),可是不包括構造方法 。

extends 關鍵字用在 class 或 interface 聲明中,用於指示所聲明的類或接口是其名稱後跟有 extends 關鍵字的類或接口的子類。 
-示例- 
public class Rectangle extends Polygon{ }

 -註釋- 
在上例中,Rectangle 類繼承 Polygon 類的全部 public 和 protected 變量和方法。 
Rectangle 類能夠重寫 Polygon 類的任何非 final 方法。 一個類只能擴展一個其餘類。

3.final 
解釋:最終的,決定性的 
用法:修飾符的一種,它能夠用來修飾類,方法,屬性。當一個屬性被修飾成final的以後,這個屬性變成了常量,它的值必須在定義的時候初始化,而且後面的代碼不能對其進行修改,它的命名應該所有都是大寫。當一個方法被修飾成final的以後,這個方法在繼承中是不可以被進行覆蓋的。當一個類被修飾成final的以後,這個類不能再有子類。
final 關鍵字能夠應用於類,以指示不能擴展該類(不能有子類)。 final 關鍵字能夠應用於方法,以指示不能重寫任何子類中的方法。
 -示例- 
public final class MyFinalClass{ } 
public class MyClass{ 
public final String myFinalMethod() { 
<statements> } } 
例子:
public final class Math{   private final float PI = 3.1415926;  
public final int abs(int i){  return i>=0?i:-I; 
} }   -註釋- 
一個類不能同時是 abstract 又是 final。abstract 意味着必須擴展類,final 意味着不能擴展類。 
一個方法不能同時是 abstract 又是 final。abstract 意味着必須重寫方法,final 意味着不能重寫方法。 
<1>對於基本類型前加以final修飾,表示被修飾的變量爲常數,不能夠修改。一個既是static又是final的字段表示只佔據一段不能改變的存儲空間。
<2>final用於對象應用時,final使應用恆定不變。一旦引用被初始化指向一個對象,就沒法再把它指向另外一個對象。
<3>final方法:一是把方法鎖定,以防止繼承類修改它的含義,二是確保繼承中使方法行爲保持不變,而且不會被覆蓋。類中全部的private方法都隱式地指定爲是final。 
<4>final參數:對於基本類型的變量,這樣作並無什麼實際意義,由於基本類型的變量在調用方法時是傳值,也就是說你能夠在方法中更改這個參數變量而不會影響到調用語句,然而對於對象變量,卻顯得很實用,覺得對象變量在傳遞時是傳遞其引用,這樣你在方法中對對象變量的修改也會影響到調用語句的對象變量,當你在方法中不須要改變做爲參數的變量時,明確使用final進行聲明,會防止你無心的修改而影響到調用方法。 
<5>final類:當將某個類的總體定義爲final時,就代表了該類不容許被繼承。
3.finally 
解釋:最後,終於,不可更改地 
用法:在異常處理機制當中,它的做用就像是人吃飯同樣,必須得作的,不論有異常仍是沒有異常都要執行的代碼就能夠放到finally塊當中去。finally塊,必需要配合try塊一塊兒使用,不能單獨使用,也不能直接和catch塊一塊兒使用。 
finally 關鍵字用來定義始終在 try-catch-finally 語句中執行的塊。finally 塊一般包含清理代碼,用在部分執行 try 塊後恢復正常運行。
-示例- try{ 
                <可能引起異常的塊> } 
                 catch (<java.lang.Exception 或子類> e){ 
                <處理異常 e 的代碼>
} finally{ 
<有異常或無異常狀況下都執行的語句> } -註釋- 
開始和結束標記 { 和 } 是 finally 子句語法的一部分,即便該子句只包含一個語句,也不能省略這兩個標記。 
每一個 try 塊都必須至少有一個 catch 或 finally 子句。 
若是執行 try 塊的任何部分,不管是否出現異常,也不論 try 或 catch 塊是否包含 return、continue 或 break 語句,都必定會執行 finally 塊中的代碼。 若是不出現異常,控件將跳過 try 塊,進入 finally 塊。 若是在執行 try 塊期間出現異常,而且相應的 catch 塊包含 break、continue 或 return 語句,控件將首先穿過 finally 塊,以後再執行 break、continue 或 return。
五、implements(接口)
用法:用來讓一個類實現一個接口的關鍵字,實現接口的這個類必須實現接口裏面全部的方法。 
implements 關鍵字在 class 聲明中使用,以指示所聲明的類提供了在 implements 關鍵字後面的名稱所指定的接口中所聲明的全部方法的實現。 
-示例- 
public class Truck implements IVehicle{ } -註釋- 
在上例中,Truck 類必須提供在 IVehicle 接口中所聲明的全部方法的實現。 
不然,Truck 類將是獨立的;它能夠聲明其餘方法和變量,並擴展另外一個類。 一個類能夠實現多個接口。

finally 

解釋:

最後,終於,不可更改地

 

用法:

 

在異常處理機制當中,它的做用就像是人吃飯同樣,必須得作的,不論有

異常仍是沒有異常都要執行的代碼就能夠放到

 

finally

塊當中去。

finally

 

塊,

必需要配合

try

塊一塊兒使用,

不能單獨使用,也不能直接和

 

catch

塊一塊兒使用。

 

finally 

關鍵字用來定義始終在

 

 

try-catch-finally

 

語句中執行的塊。

 

finally 

塊一般包含清理代碼,用在部分執行

 

 try 

塊後恢復正常運行。

 

-

示例

try{ 

<

可能引起異常的塊

catch (<java.lang.Exception 

或子類

> e){ 

<

處理異常

 e 

的代碼

>

六、instanceof 
用法:instanceof 關鍵字用來肯定對象所屬的類。 
-示例- 
if (node instanceof TreeNode){ <statements> } -註釋- 
在上例中,若是 node 是 TreeNode 類的實例,或者是 TreeNode 的子類的實例,則 instanceof 表達式的值將爲 true。 
instanceof 一般是用於判斷父類或者接口的引用是不是某個子類的實例,例如: 
class Animal{} 
class Bird extends Animal {} class Dog extends Animal {} Animal a= new Bird(); 
System.out.println( a instanceof Bird);  System.out.println( a instanceof Dog);
七、interface 
解釋:接口,界面 
用法:它本質上是一個類,一個徹底抽象的類,裏面沒有任何實現的方法。它不是用來繼承的,是用來實現的。某個類若是實現了接口就必需要實現接口裏面的全部方法。而且接口是不能用來實例化的,它也是不能經過new關鍵字得到對象。 
interface 關鍵字用來聲明新的 Java 接口,接口是方法的集合。 接口是 Java 語言的一項強大功能。任何類均可聲明它實現一個或多個接口,這意味着它實現了在這些接口中所定義的全部方法。 
-示例- 
public interface IPolygon{ 
public float getArea(); public int getNumberOfSides(); public int getCircumference(); } -註釋- 
實現了接口的任何類都必須提供在該接口中的全部方法的實現。 一個類能夠實現多個接口。
八、static 解釋:靜態的 
用法:修飾符的一種,可以用來修飾屬性和方法。須要注意的是被修飾的屬性和方法,再也不屬於對象全部,而是屬於類,意味着,要訪問這些屬性和方法再也不經過對象而是直接用類名來訪問。另外,靜態的方法不可以訪問非靜態屬性,非靜態的方法可以訪問靜態的屬性。 
static 關鍵字能夠應用於內部類(在另外一個類中定義的類)、方法或字段(類的成員變量)。 
-示例- 
public class MyPublicClass{ public final static int MAX_OBJECTS = 100; static int _numObjects = 0; static class MyStaticClass{ } 
static int getNumObjects(){ } } -註釋- 
一般,static 關鍵字意味着應用它的實體在聲明該實體的類的任何特定實例外部可用。 
static(內部)類能夠被其餘類實例化和引用(即便它是頂級類)。在上面的-示例-中,另外一個類中的代碼能夠實例化 MyStaticClass 類,方法是用包含它的類名來限定其名稱,如 MyClass.MyStaticClass。 
static 字段(類的成員變量)在類的全部實例中只存在一次。能夠從類的外部調用 static 方法,而不用首先實例化該類。這樣的引用始終包括類名做爲方法調用的限定符。在上面的示例中,MyClass 類外部的代碼以 MyClass.getNumObjects() 的形式調用 getNumObjects() static 方法。 
模式: 
public final static <type> varName = <value>; 
一般用於聲明能夠在類的外部使用的類常量。在引用這樣的類常量時須要用類名加以限定。在上面的-示例-中,另外一個類能夠用 MyClass.MAX_OBJECTS 形式來引用 MAX_OBJECTS 常量。 
1>一般在一個類中定義一個方法爲static,就是說無須本類的對象就能夠直接調用。 
2>靜態變量和靜態方法相似。全部此類實例共享此靜態變量,也就是說類裝載時,只分配一塊存儲空間,全部此類的對象均可以操控此塊存儲空間,固然對於final就另當別論了。
3>static定義的變量會優先於任何其餘非static變量,不論其出現順序如何。
 4>static{}着是用來顯式的靜態變量初始化,這段代碼只會初始化一次,且在類被第一次裝載時。
5>在涉及到繼承的時候,會先初始化父類的static變量,而後是子類的。
 6>一般一個普通類不容許聲明爲靜態的,只有一個內部類才能夠。這時這個聲明爲靜態的內部類能夠直接做爲一個普通類來使用,而不須要實例一個外部類。
九、synchronized 
用法:synchronized 關鍵字能夠應用於方法或語句塊,併爲一次只應由一個線程執行的關鍵代碼段提供保護。當它用來修飾一個方法或者一個代碼塊的時候,可以保證在同
一時刻最多隻有一個線程執行該段代碼 
-示例- 
public class MyClass{ 
public synchronized static String mySyncStaticMethod(){ } 
public synchronized String mySyncMethod(){ } }
public class MyOtherClass{ 
Object someObj; 
public String myMethod(){ 
<statements> 
synchronized (someObj){ 
<statements affecting someObj> }}}
synchronized 關鍵字可防止代碼的關鍵代碼段一次被多個線程執行。 若是應用於靜態方法(如上例中的 MySyncStaticMethod),那麼,當該方法一次由一個線程執行時,整個類將被鎖定。 
若是應用於實例方法(如上例中的 MySyncMethod),那麼,當該方法一次由一個線程訪問時,該實例將被鎖定。 
若是應用於對象或數組,當關聯的代碼塊一次由一個線程執行時,對象或數組將被鎖定。 
synchronized 關鍵字,它包括兩種用法:synchronized 方法和 synchronized 塊。  
  1. synchronized 方法:經過在方法聲明中加入 synchronized關鍵字來聲明 synchronized 方法。 
如:  public synchronized void accessVal(int newVal); 
synchronized 方法控制對類成員變量的訪問:每一個類實例對應一把鎖,每一個 synchronized 方法都必須得到調用該方法的類實例的鎖方能執行,不然所屬線程阻塞,方法一旦執行,就獨佔該鎖,直到從該方法返回時纔將鎖釋放,此後被阻塞的線程方能得到該鎖,從新進入可執行狀態。這種機制確保了同一時刻對於每個類實例,其全部聲明爲 synchronized 的成員函數中至多隻有一個處於可執行狀態(由於至多隻有一個可以得到該類實例對應的鎖),從而有效避免了類成員變量的訪問衝突(只要全部可能訪問類成員變量的方法均被聲明爲 synchronized)。  
 在 Java 中,不光是類實例,每個類也對應一把鎖,這樣咱們也可將類的靜態成員函數聲明爲 synchronized ,以控制其對類的靜態成員變量的訪問。
synchronized 方法的缺陷:若將一個大的方法聲明爲synchronized 將會大大影響效率,典型地,若將線程類的方法 run() 聲明爲synchronized ,因爲在線程的整個生命期內它一直在運行,所以將致使它對本類任何 synchronized 方法的調用都永遠不會成功。固然咱們能夠經過將訪問類成員變

量的代碼放到專門的方法中,

將其聲明爲

 synchronized 

並在主方法中調用來

解決這一問題,

可是

 Java 

爲咱們提供了更好的解決辦法,

那就是

 synchronized 

塊。

 
2. synchronized 塊:經過 synchronized關鍵字來聲明synchronized 塊。語法以下:  
  synchronized(syncObject) {    //容許訪問控制的代碼    }  
   synchronized 塊是這樣一個代碼塊,其中的代碼必須得到對象 syncObject (如前所述,能夠是類實例或類)的鎖方能執行,具體機制同前所述。因爲能夠針對任意代碼塊,且可任意指定上鎖的對象,故靈活性較高。 
對synchronized(this)的一些理解 
1、當兩個併發線程訪問同一個對象object中的這個synchronized(this)同步代碼塊時,一個時間內只能有一個線程獲得執行。另外一個線程必須等待當前線程執行完這個代碼塊之後才能執行該代碼塊。package ths; 
public class Thread1 implements Runnable {       public void run() {            synchronized(this) {  
               for (int i = 0; i < 5; i++) {                      
System.out.println(Thread.currentThread().getName() + " synchronized loop " + i);  
               }            }       }  
     public static void main(String[] args) {          
  Thread1 t1 = new Thread1(); 
Thread ta = new Thread(t1, "A");        
   Thread tb = new Thread(t1, "B");ta.start();         
   tb.start();       } }
2、當一個線程訪問object的一個synchronized(this)同步代碼塊時,另外一個線程仍然能夠訪問該object中的非synchronized(this)同步代碼塊。
3、然而,當一個線程訪問object的一個synchronized(this)同步代碼塊時,另外一個線程仍然能夠訪問該object中的非synchronized(this)同步代碼塊。 
 尤爲關鍵的是,當一個線程訪問object的一個synchronized(this)同步代碼塊時,其餘線程對object中全部其它synchronized(this)同步代碼塊的訪問將被阻塞。
4、第三個例子一樣適用其它同步代碼塊。也就是說,當一個線程訪問object的一個synchronized(this)同步代碼塊時,它就得到了這個object的對象鎖。結果,其它線程對該object對象全部同步代碼部分的訪問都被暫時阻塞。
十、transient 
用法:transient 關鍵字能夠應用於類的成員變量,以便指出該成員變量不該 在包含它的類實例已序列化時被序列化。 
-示例- 
public class MyClass{ 
private transient String password; } 
java語言的關鍵字,變量修飾符,若是用transient聲明一個實例變量,當對象存儲時,它的值不須要維持。 
Java的serialization提供了一種持久化對象實例的機制。當持久化對象時,可能有一個特殊的對象數據成員,咱們不想    
用serialization機制來保存它。爲了在一個特定對象的一個域上關閉serialization,能夠在這個域前加上關鍵字transient。    
transient是Java語言的關鍵字,用來表示一個域不是該對象串行化的一部分。當一個對象被串行化的時候,transient型變量的值不包括在串行化的表示中,然而非transient型的變量是被包括進去的。
十一、volatile 
用法:volatile 關鍵字用於表示能夠被多個線程異步修改的成員變量。 
注意:volatile 關鍵字在許多 Java 虛擬機中都沒有實現。 -示例- 
public class MyClass{ 
volatile int sharedValue; } -註釋- 
volatile 的目標用途是爲了確保全部線程所看到的指定變量的值都是相同的。 
Volatile修飾的成員變量在每次被線程訪問時,都強迫從主內存中重讀該成員變量的值。並且,當成員變量發生變化時,強迫線程將變化值回寫到主內存。這樣在任什麼時候刻,兩個不一樣的線程老是看到某個成員變量的同一個值。Java語言規範中指出:爲了得到最佳速度,容許線程保存共享成員變量的私有拷貝,並且只當線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比。
 
這樣當多個線程同時與某個對象交互時,就必需要注意到要讓線程及時的獲得共享成員變量的變化。      
而volatile關鍵字就是提示VM:對於這個成員變量不能保存它的私有拷貝,而應直接與共享成員變量交互。   
使用建議:在兩個或者更多的線程訪問的成員變量上使用volatile。當要訪問的變量已在synchronized代碼塊中,或者爲常量時,沒必要使用。    
因爲使用volatile屏蔽掉了VM中必要的代碼優化,因此在效率上比較低,所以必定在必要時才使用此關鍵字。

finally 

解釋:

最後,終於,不可更改地

 

用法:

 

在異常處理機制當中,它的做用就像是人吃飯同樣,必須得作的,不論有

異常仍是沒有異常都要執行的代碼就能夠放到

 

finally

塊當中去。

finally

 

塊,

必需要配合

try

塊一塊兒使用,

不能單獨使用,也不能直接和

 

catch

塊一塊兒使用。

 

finally 

關鍵字用來定義始終在

 

 

try-catch-finally

 

語句中執行的塊。

 

finally 

塊一般包含清理代碼,用在部分執行

 

 try 

塊後恢復正常運行。

 

-

示例

try{ 

<

可能引起異常的塊

catch (<java.lang.Exception 

或子類

> e){ 

<

處理異常

 e 

的代碼

>

finally 

解釋:

最後,終於,不可更改地

 

用法:

 

在異常處理機制當中,它的做用就像是人吃飯同樣,必須得作的,不論有

異常仍是沒有異常都要執行的代碼就能夠放到

 

finally

塊當中去。

finally

 

塊,

必需要配合

try

塊一塊兒使用,

不能單獨使用,也不能直接和

 

catch

塊一塊兒使用。

 

finally 

關鍵字用來定義始終在

 

 

try-catch-finally

 

語句中執行的塊。

 

finally 

塊一般包含清理代碼,用在部分執行

 

 try 

塊後恢復正常運行。

 

-

示例

try{ 

<

可能引起異常的塊

catch (<java.lang.Exception 

或子類

> e){ 

<

處理異常

 e 

的代碼

>

相關文章
相關標籤/搜索