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中任何元素的方法,可是不能加入元素。