HeadFirstJava

java執行過程的前因後果java

源代碼——編譯器——輸出——java虛擬機程序員

擴展名爲.java ——擴展名爲.class函數

 

不要直接用類名點變量來改變屬性值,通常都用get、set方法。封裝的基本原則:將你的實例變量標記爲私有,並提供公有的getter與setter來控制存取動做。測試

 

實例變量永遠都會有默認值,若是你沒有明確的賦值給實例變量,或者沒有調用setter,實例變量仍是會有值的。線程

integer  0設計

float    0.0對象

boolean false排序

reference null繼承

局部變量沒有默認值,若是在變量被初始化前就要使用的話,編譯器會顯示錯誤。接口

(實例變量是聲明在類內而不是方法中,局部變量是聲明在方法中的)

 

面向對象思考就是要關注程序中出現的事物而不是過程。

 

將String類型轉換爲int類型: Integer.parseInt("3");

 

ArrayList

add,remove,contains,isEmpty,indexOf,size,get

 c.getClass() ——告訴你此對象是從哪裏別初始化的

c.hashCode() ——列出此對象的哈希代碼,能夠把它想成是惟一的一個ID

 

任何從ArrayList<Object>取出的東西都會被看成Object類型的引用而無論它原來是什麼。且編譯器沒法將此對象識別爲Object之外的事物。若是非要將Object類型轉換爲某個具體類型,能夠用到強制類型轉換,好比

Dog d = (Dog) object;//肯定是一個Dog對象

if (object instanceof Dog){

   Dog d = (Dog) object;

}//若是不能肯定,能夠用instance of 運算符檢查。

 

Java的接口就好像是100%的純抽象類(public abstract),全部接口的方法都是抽象的,因此任何Pet的類都必需要實現這些方法。

 

如何判斷應該是設計類、子類、抽象類或接口呢?

1)若是新的類沒法對其餘的類經過 IS - A 測試時,就設計不繼承其餘類的類;

2)只有在須要某類的特殊化版本時,以覆蓋或增長新的方法來繼承現有的類

3)當你須要定義一羣子類的模板,又不想讓程序員初始化此模板時,設計出抽象的類給它們用

4)若是想要定義出類能夠扮演的角色,使用接口

 

要點:

1)若是不想讓某個類被初始化,就以abstract這個關鍵詞將它標記爲抽象的;

2)抽象的類能夠帶抽象和非抽象的方法;

3)若是類帶有抽象的方法,則此類一定標識爲抽象的;

4)抽象的方法沒有內容,它的聲明是以分號結束的;

5)抽象的方法必須在具體的類中運行;

6)Java全部的類都是Object直接或間接的子類;

7)方法能夠聲明Object的參數或返回類型;

8)無論實際上所引用的對象是什麼類型,只有在引用變量的類型就是帶有某方法的類型時才能調用該方法;

9)Object引用變量在沒有類型轉換的狀況下不能賦值給其餘的類型,若堆上的對象類型與所要轉換的類型不兼容,則此轉換會在執行期產生異常;

10)java不容許多繼承;

11)實現某個接口的類必須實現它全部的方法,由於這些方法都是public與abstract的;

12)要從子類調用父類的方法能夠用super這個關鍵詞來引用。

 

堆與棧要點:

1)咱們關心棧與堆這兩種內存空間;

2)實例變量是聲明在類中方法以外的地方;

3)局部變量是聲明在方法或方法參數上;

4)全部局部變量都存在於棧上相對應的堆棧塊中;

5)對象引用變量與primitive主數據類型變量都是放在棧上;

6)無論實例變量仍是局部變量,對象自己都會在堆上

 

構造函數要點

1)構造函數不會被繼承;

2)實例變量保存在所屬的對象中,位於堆上;

3)若是實例變量是個對對象的引用,則引用與對象都是在堆上;

4)構造函數是個會在新建對象的時候執行程序代碼;

5)構造函數必須與類同名且沒有返回對象;

6)能夠用構造函數來初始化建立對象的狀態;

7)最好能有無參的構造函數讓人能夠選擇使用默認值;

8)構造函數能夠是公有、私有或不指定的

9)靜態方法是不能調用非靜態的變量,也不能調用非靜態的方法

10)靜態變量是在類被加載時初始化的

11)一個被標記爲final的變量表明它一旦被初始化以後就不會改動,也就是說類加載以後靜態final變量就一直會維持原值。

12)final的變量表明你不能改變它的值,final的method表明你不能覆蓋掉該method,final的類表明你不能繼承該類(也就是建立它的子類)

 

序列化——將對象的狀態信息轉換爲能夠存儲或傳輸的形式的過程。

 

對象的序列化要點

1)能夠經過序列化來存儲對象的狀態

2)對象必須實現序列化這個接口才能被序列化。若是父類實現序列化,則子類也就自動實現

3)當對象被序列化時,整個對象版圖都會被序列化,這表明它的實例變量所引用的對象也會被序列化

4)除非該實例變量被標記爲transient,不然,該變量在還原的時候會被賦予null或原始數據類型的默認值

 

如何啓動新的線程?

1)創建Runnable對象(線程的任務)

Runnable threadJob = new MyRunnable();

2)創建Thread對象(執行工人)並賦值Runnable(任務)

Thread myThread = new Thread(threadJob);

3)啓動Thread

myThread.start();

對於Thread而言,它是一個工人,而Runnable就是這個工人的工做。Runnable帶有會放在執行空間的第一項,方法:run()。

synchronized關鍵詞表明線程須要一把鑰匙來存取被同步化(synchronized)過的線程。要保護數據,就把做用在數據上的方法給同步化。

 

TreeSet:以有序狀態保持並可預防重複

HashMap:可用成對的name/value來保存與取出

LinkedList:針對常常插入或刪除中間元素所設計的高效率集合

HashSet:防止重複的集合,可快速地尋找相符的元素

LinkedHashMap:相似HashMap,但可記住元素插入的順序,也能夠設定成依照元素上次存取的前後來排序。

 

若是把字符串放進Treeset而不是ArrayList,這些string會自動地按照字母順序排在正確的位置。

Collections.sort(list);會把list中的stirng按照字母排序。

 

public <T extends Animal> void takeThing(ArrayList<T> list);//可使用任何一種Animal的ArrayList

public void takeThing(ArrayList <Animal> list);//只能使用Animal的ArrayList

 

萬用字符<?>

在方法參數中使用萬用字符時,編譯器會阻止任何可能破壞引用參數所指集合的行爲。你能調用list中任何元素的方法,可是不能加入元素。

相關文章
相關標籤/搜索