關鍵字:html
(1)性質不一樣面試
(2)做用不一樣安全
定義類:沒法被繼承,這也就意味着此類在一個繼承樹中是一個葉子類;類成員是否是final均可以。多線程
(1)使用位置不一樣jvm
(2)內容不一樣函數
(3)做用不一樣post
總結:函數調用時,若是須要向上層拋出異常,就必須在函數頭部顯式地聲明(throws Exception1, Exception2)異常類型;若是僅須要在方法體內部處理異常,方法體內部可自行處理該異常,thorw拋出具體的異常實例(catch(Exception1 e){...})。性能
static關鍵字可用來修飾屬性、方法、代碼塊,目的是把對象相關的變成類相關的,即:不加static的成員是對象相關的,歸單個對象全部;加static修飾的成員是類成員,能夠經過類名直接調用,歸全部對象全部。優化
static修飾的成員變量和成員方法習慣上稱爲靜態變量和靜態方法,能夠直接經過類名來訪問,訪問語法爲:this
(1)static修飾屬性(類變量、靜態變量)
因此通常在須要實現如下兩個功能時使用靜態變量:
1).在對象之間共享值時;2).方便訪問變量時
(2)static修飾方法(靜態方法)
Java中main方法必須爲static的緣由:
在類加載時沒法建立對象,而靜態方法能夠不經過對象調用,因此在類加載時能夠經過main方法入口運行程序。
(3)static修飾代碼塊(初始化塊、靜態代碼塊)
格式: static{...}
static代碼塊也叫靜態代碼塊,是在類中獨立於類成員的static語句塊,能夠有多個,位置能夠隨便放,它不在任何的方法體內,JVM加載類時會執行這些靜態的代碼塊,若是static代碼塊有多個,JVM將按照它們在類中出現的前後順序依次執行它們,每一個代碼塊只會被執行一次。
初始化總結(靜態變量->實例變量->按聲明初始化->執行構造方法)
1) 首次使用某個類時,JVM查找相應的類文件並加載(Java只有在必要時纔會逐步載入相應的類文件)
首先爲全部的靜態變量分配存儲空間並初始化爲默認值(全局變量),而後按照聲明靜態變量時指定的初始化動做的順序,以及靜態初始化塊中的語句在類定義中出現的順序依次執行。這些靜態的初始化動做只會在其所屬類的類文件加載時執行一次。
2)類文件加載完畢後,若是須要建立類的對象,則進行以下初始化動做
JVM爲全部的實例變量分配足夠的存儲空間並初始化爲默認值(局部變量);而後按聲明實例變量時指定初值的初始化動做和實例初始化塊中的語句在類中出現的順序依次執行,以後再調用相應的構造方法。
stract class和interface是支持抽象類定義的兩種機制。正是因爲這兩種機制的存在,才賦予了Java強大的面向對象能力。abstract class和interface之間在對於抽象類定義的支持方面具備很大的類似性,區別:
Abstract class | Interface | |
實例化 | 不能 | 不能 |
類 | 抽象類通常只能做爲其餘類的基類。一個類只能有一重繼承關係。 | 一個類能夠實現多個interface |
數據成員 | 可有私有的,默認是friendly 型,其值能夠在子類中從新定義,也能夠從新賦值,能夠非abstract | 不可有私有的,默認是public static final 型,且必須賦初值,實現類中不能從新定義,不能改變其值。 |
方法成員 | 能夠私有的,能夠有非abstract方法,必須實現 | 不可有私有的,默認是public,abstract 類型 |
設計理念 | 表示的是「is-a」關係 | 表示的是「like-a」關係 |
實現 | 須要繼承,要用extends | 須要實現,用implements |
抽象類(Abstract Class):
(1)只能做爲其餘類的基類,不能被實例化(new);
(2)抽象類中的成員是否是abstract無所謂,並非必須的。(能夠有抽象成員,也能夠沒有任何抽象成員)
(3)抽象類不能同時是final的。抽象的老是但願被繼承,而final類不可被繼承。final和abstract不可同時存在。
(4)非抽象類繼承抽象類,必須覆蓋其全部的抽象成員。抽象類繼承抽象類,能夠不覆蓋全部的抽象成員。
(5)抽象類容許被聲明
接口(interface):
接口的本質是一種特殊的抽象類,用來描述系統對外提供的全部服務。
(1)接口中,全部方法都是公開、抽象的:public abstract。(都必須被繼承)
(2)接口中,全部屬性都是公開、靜態、常量:public static final,且必須賦初值。(全部實現類共享且不可改變)
接口老是但願被實現被訪問的,所以全部成員都必須是公開的(public),確保外界能夠訪問。接口僅僅描述系統能夠作什麼,但不指明如何去作,具體操做由實現類完成,所以方法都是abstract的,都必須被繼承;接口不涉及任何的實現細節,所以無構造方法,接口不能被實例化;無變量,只有靜態常量(static final),由於要被全部的實現類共享;類的繼承只能單繼承,可是接口能夠一次實現多個,用「,」隔開。
super:
super能夠理解爲是指向本身父類對象的一個指針,指的是離本身最近的一個父類。
用法:
this:
this能夠理解爲指向當前對象自身的一個指針,即當前正在執行本方法的那個對象實例。位於函數體內部。
用法:
引用構造函數時:
this和super都無需聲明。
(1)做用範圍:volatile僅能使用在變量級別;synchronized則可使用在變量、方法、和類級別;
(2)volatile本質是在告訴jvm當前變量在寄存器(工做內存)中的值是不肯定的,須要從主存中讀取;synchronized則是鎖定當前變量,只有當前線程能夠訪問該變量,其餘線程被阻塞住。
(3)volatile不會形成線程的阻塞;synchronized可能會形成線程的阻塞。
(4)volatile只能在線程內存和主內存之間同步一個變量的值,而synchronized則同步在線程內存和主內存之間的全部變量的值,經過鎖住和釋放監聽器來實現。
(5)volatile標記的變量不會被編譯器優化;synchronized標記的變量能夠被編譯器優化
(6)顯然,synchronized在性能上將比volatile更加有所消耗
(7)volatile僅能實現變量的修改可見性,不能保證原子性;而synchronized則能夠保證變量的修改可見性和原子性
詳細的 synchronize 和 volatile用法介紹請見博文:Java多線程(二) —— 線程安全、線程同步、線程間通訊(含面試題集) 第二節【2、線程同步】