static 能夠修飾什麼:成員變量、成員方法、靜態塊;編程
final 能夠修飾什麼:成員變量、成員方法、類;數組
1、final關鍵字能夠用來修飾類、方法、變量。各有不一樣。多線程
A、修飾類(class)。
一、該類不能被繼承。
二、類中的方法不會被覆蓋,所以默認都是final的。
三、用途:設計類時,若是該類不須要有子類,沒必要要被擴展,類的實現細節不容許被改變,那麼就設計成final類模塊化
B、修飾方法(method)
一、該方法能夠被繼承,可是不能被覆蓋。
二、用途:一個類不容許子類覆蓋該方法,則用final來修飾
三、好處:能夠防止繼承它的子類修改該方法的意義和實現;更爲高效,編譯器在遇到調用fianal方法轉入內嵌機制,提升了執行效率。
四、注意:父類中的private成員方法不能被子類覆蓋,所以,private方法默認是final型的(能夠查看編譯後的class文件)spa
C、修飾變量(variable)
一、用final修飾後變爲常量。包括靜態變量、實例變量和局部變量這三種。
二、特色:能夠先聲明,不給初值,這種叫作final空白。可是使用前必須被初始化。一旦被賦值,將不能再被改變。線程
D、修飾參數(arguments)
一、用final修飾參數時,能夠讀取該參數,可是不能對其做出修改設計
2、final關鍵字不能用來抽象類和接口。指針
成員變量的修飾符:code
private:自身能夠訪問,同包子類不能繼承,同包類不能訪問;對象
默認:自身能夠訪問,同包子類能夠繼承,同包類能夠訪問;
protected:自身能夠訪問,同包子類能夠繼承,不一樣包子類能夠繼承,同包類能夠訪問,其餘類不能夠訪問;
public:不一樣包子類能夠繼承,其餘類能夠訪問;
public > protected > default > private
public 指定該變量爲公共的,他能夠被任何對象的方法訪問。
private 指定該變量只容許本身的類的方法訪問,其餘任何類(包括子類)中的方法均不能訪問。
protected 指定該變量能夠被自身和子類訪問。在子類中能夠覆蓋此變量。
(1.基本類型; 2.基本類型封裝;3.String;4.非字符串變量)
equals()是Object類的方法;
(1) 若是是基本類型比較,那麼只能用==來比較,用equals會編譯錯誤,由於不是對象。int a = 3;
(2) 對於基本類型的包裝類型,好比Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用變量,==是比較地址的,而equals是比較內容的。Integer n1 = new Integer(30);
(2.5)對於String a = 「a」; Integer b = 1;這種類型的特有對象建立方式,==的時候值是相同的。
(3)對於字符串變量來講,使用「==」和「equals()」方法比較字符串時,其比較方法不一樣。
「==」比較兩個變量自己的值,即兩個對象在內存中的首地址。
「equals()」比較字符串中所包含的內容是否相同。
String s1 = "123";
String s2 = "123";
String s4 = new String("123");
String s5 = new String("123");
s1==s2 true; s1.equals(s2) true;
s4==s5 false; s4.equals(s5) true;
s1==s4 false; s1.equals(s4) true;
s1/s2分別指向字符串常量"123"建立的對象,在常量池裏只有一個對象,內容爲"123";
s4/s5兩個引用對象指向的對象內容相同,可是new操做符建立的,內存中分配兩塊空間給這兩個對象,因此內存地址不一樣。
(4)對於非字符串變量來講,"=="和"equals"方法的做用是相同的都是用來比較其對象在堆內存的首地址,即用來比較兩個引用變量是否指向同一個對象。
基本類型有八種:
整型4種:byte/short/int/long 字節數:1/2/4/8
字符型1種:char 2
浮點型2種:float/double 4/8
布爾型1種:boolean 1/8(八分之一字節)
一個字節等於8位,等於256個數,就是-128到127
大寫的B表示Bytes=字節;小寫的b表示bit=位;1byte=8bit;
自動轉換:(小可轉大,大轉小會失去精度)
byte -> short/char -> int -> long -> float -> double
Error和Exception都實現了Throwable接口
Error指的是JVM層面的錯誤,好比內存不足OutOfMemoryError;
Exception 指的是代碼邏輯的異常,好比下標越界OutOfIndexException;
Exception分爲可查異常CheckedException和運行時異常RuntimeException:
可查異常是必須處理的異常,要麼try catch住,要麼往外拋,誰調用,誰處理,好比 FileNotFoundException、IOException、SQLException等。若是不處理,編譯器就不讓你經過。
運行時異常 又叫作非可查異常,在編譯過程當中,不要求必須進行顯示捕捉。
常見的Runtime Excepiton?
NullPointerException 空指針異常
ArithmeticException 算術異常,好比除數爲零
ClassCastException 類型轉換異常
ConcurrentModificationException 同步修改異常,遍歷一個集合的時候,刪除集合的元素,就會拋出該異常
IndexOutOfBoundsException 數組下標越界異常
NegativeArraySizeException 爲數組分配的空間是負數異常
爲何分兩種異常?
Java之因此會設計運行時異常的緣由之一,是由於下標越界,空指針這些運行時異常太過於廣泛,若是都須要進行捕捉,代碼的可讀性就會變得很糟糕。
9種;(簡要介紹各方法)
1.對象的複製/獲取/String/釋放:clone/getClass/toString/finalize;
2.hash:equals/hashCode;
3.多線程:wait/notify/notifyAll
clone:實現對象的淺複製;
getClass:得到運行時類對象;
finalize:用於釋放資源;
equals:比較對象是否相等;基本類型不能夠用equals,對於String類型「equals」和「==」做用不一樣;
hashcode:用於hash尋找;
wait:使當前線程等待該對象的鎖,當前線程必須是該對象的擁有者,也就是具備該對象的鎖;wait()方法一直等待,直到得到鎖或者被中斷。wait(longtimeout)設定一個超時間隔,若是在規定時間內沒有得到鎖就返回。
調用該方法後當前線程進入睡眠狀態,直到如下事件發生:
(1)其餘線程調用了該對象的notify方法。
(2)其餘線程調用了該對象的notifyAll方法。
(3)其餘線程調用了interrupt中斷該線程。
(4)時間間隔到了。
此時該線程就能夠被調度了,若是是被中斷的話就拋出一個InterruptedException異常。
notify:喚醒在該對象上等待的某個線程
static{} > {} > className{} > method(){}
靜態代碼塊>匿名方法塊>構造方法>普通方法。