- stack segment: 存放局部變量
- heap segment : 存放new關鍵字創建的東西,例如類的對象
- data segment : 存放靜態變量和字符串常量(打印到控制檯的文本)
- code segment : 存放程序的代碼
2.面向對象編程的思維:
- 考慮這個實際問題中存在哪些類和對象
- 考慮這些類和對象有哪些數據成員和方法
- 考慮這些類和對象之間的關係
3.如何在內存中區分類和對象?
- 類是靜態的概念,存在於代碼區
- 對象是new運算符創建出來的,位於堆內存中,類的每個實例成員變量在不同的對象中都有不同的值;而方法只有一份,執行的時候才佔用內存
4.對象:是指棧空間內的一小塊內存指向堆空間的一大塊內存
5.方法執行完畢後,爲這個方法所分配的所有的局部變量會全部消失
6.必須使用new關鍵字來創建對象
7.在給函數命名時,用一個動詞加S,代表着第三人稱的含義,例如:contains
8.同一個類的每個對象共享該類的靜態方法,非靜態的方法是針對每一個對象調用的
9.關於this關鍵字:
- 在類的方法定義中使用,代表使用該方法的對象的引用
- 當必須要指出當前使用該方法的對象是誰時,要使用this
- 有時使用this可以處理方法中成員變量和參數重名的情況
- this可以看做一個變量值是當前對象的引用
- this還可以在一個構造方法中調用其所屬的另外一個構造方法;當用this調用另外一個構造方法時,傳遞的參數不能是關鍵字this或當前對象的實例成員
10.強制啓用垃圾回收器:System.gc();
11.寫程序時,一般把所有的數據成員聲明爲private的,然後再爲他們一一定義getXXX()方法;而每一個方法則聲明爲public的
12.靜態方法不能訪問非靜態成員,靜態方法不再是針對於某個具體的對象來調用,非靜態成員專屬於某一個特定對象,非靜態成員的訪問需要通過對象
13. 如果要把一個類放在package中:先放在package中,但是編譯的文件必須位於正確的目錄下(和package的層次完全一致);
訪問同一個包中類時,不需要引用;java-->lang中的類使用的話不需要被引入,可直接使用.
14.繼承: A extends B ( A是一種B )
- 通過繼承,子類自動擁有了基類的所以成員(數據成員和一般方法,但不包括構造方法)
- java只支持單繼承
- 一個子類只擁有一個基類,但是一個基類可以擁有多個子類
15.方法重寫:
- 重寫方法必須擁有與被重寫方法一樣的方法名,返回值類型和參數列表
- 重寫方法不能比被重寫方法有更嚴格的訪問權限
16.訪問權限之間的嚴格程度比較:
public < protected < default < private
17.super關鍵字:
- 指向父類的對象(引用基類的成分),和this功能相似
18.繼承中的構造方法:
- 子類的構造過程中,必須調用基類的構造方法
- 子類可以在自己的構造方法中使用super(形參)調用基類的構造方法
- 如果用super關鍵字調用基類的構造方法,則必須寫在子類構造方法的第一行
- 如果子類的構造方法中沒有顯示的調用父類的構造方法,則系統默認調用基類的無參構造方法
- 如果既沒有顯示的調用父類的構造方法,又沒有調用無參的構造方法,則編譯出錯
19.多態存在的三個條件:
- 要有繼承
- 要有重寫
- 父類引用指向子類對象
20.抽象方法( public abstract void methodname() ):
- 含有抽象方法的類必須被聲明爲抽象類
- 抽象類必須被繼承,抽象方法必須被重寫
- 抽象類不能被實例化
- 抽象方法只需聲明不需實現
21.final關鍵字:
- final的變量值不能改變
- final的方法不能被重寫
- final的類不能被繼承
22.interface(接口):是一種抽象類,只包含變量和方法的定義,而沒有實現。
- 接口可以多重實現
- 接口中聲明屬性默認爲public static final的;也只能是public static final的
- 接口中只能定義抽象方法,而這些方法默認爲public的,也只能是public的
- 接口可以繼承其他的接口,並添加新的抽象方法和屬性
- 多個無關的類可以實現同一個接口
- 一個類可以實現多個無關接口
- 與繼承關係相似,接口與實現類之間存在多態性
23.類String的equals()方法已經被重寫,當比較的兩個String類代表的字符串的字符序列完全相等時,返回true,否則返回false。
24.類Object的equals()方法比較的是兩個引用是否指代同一個對象(指向同一塊內存區域)。
25.對象轉型(casting):
- 一個基類的引用型變量可以指向其子類的對象。
- 一個基類的引用不可以訪問其子類新增加的成員(屬性和方法)。
- 可以使用引用變量 instanceof 類名 來判斷該引用類型變量所指向的對象是否屬於該類或該類的子類。
- 子類的對象可以當做基類的對象來使用稱作向上轉型(upcasting)。
- 基類的對象可以當做基類的對象來使用稱作向下轉型(downcasting)。
26.多態的概念:
- 動態綁定(多態)是指在執行期間(而非綁定期間)判斷所引用的對象的實際類型,根據其實際的類型調用實際的方法。
27.異常和重寫的關係:
- 重寫方法需拋出與原方法所拋出異常類型一致異常或不拋出異常。
28.接口和抽象類的區別是什麼?
Java提供和支持創建抽象類和接口。它們的實現有共同點,不同點在於:
- 接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
- 類可以實現很多個接口,但是隻能繼承一個抽象類
- 類如果要實現一個接口,它必須要實現接口聲明的所有方法。但是,類可以不實現抽象類聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。
- 抽象類可以在不提供接口方法實現的情況下實現接口。
- Java接口中聲明的變量默認都是final的。抽象類可以包含非final的變量。
- Java接口中的成員函數默認是public的。抽象類的成員函數可以是private,protected或者是public。
- 接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含main方法的話是可以被調用的
29.有三種方式可以用來創建線程:
- 繼承Thread類
- 實現Runnable接口
- 應用程序可以使用Executor框架來創建線程池
實現Runnable接口這種方式更受歡迎,因爲這不需要繼承Thread類。在應用設計中已經繼承了別的對象的情況下,這需要多繼承(而Java不支持多繼承),只能實現接口。同時,線程池也是非常高效的,很容易實現和使用。
30.線程的幾種可用狀態
線程在執行過程中,可以處於下面幾種狀態:
- 就緒(Runnable):線程準備運行,不一定立馬就能開始執行。
- 運行中(Running):進程正在執行線程的代碼。
- 等待中(Waiting):線程處於阻塞的狀態,等待外部的處理結束。
- 睡眠中(Sleeping):線程被強制睡眠。
- I/O阻塞(Blocked on I/O):等待I/O操作完成。
- 同步阻塞(Blocked on Synchronization):等待獲取鎖。
- 死亡(Dead):線程完成了執行。
31.HashMap和Hashtable的區別
- HashMap和Hashtable都實現了Map接口,因此很多特性非常相似。但是,他們有以下不同點:
- HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null。
- Hashtable是同步的,而HashMap不是。因此,HashMap更適合於單線程環境,而Hashtable適合於多線程環境。
- HashMap提供了可供應用迭代的鍵的集合,因此,HashMap是快速失敗的。另一方面,Hashtable提供了對鍵的列舉(Enumeration)。
- 一般認爲Hashtable是一個遺留的類。
32.數組(Array)和列表(ArrayList)有什麼區別?什麼時候應該使用Array而不是ArrayList?
下面列出了Array和ArrayList的不同點:
- Array可以包含基本類型和對象類型,ArrayList只能包含對象類型。
- Array大小是固定的,ArrayList的大小是動態變化的。
- ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
- 對於基本類型數據,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本數據類型的時候,這種方式相對比較慢。
33.ArrayList和LinkedList有什麼區別?
ArrayList和LinkedList都實現了List接口,他們有以下的不同點:
-
ArrayList是基於索引的數據接口,它的底層是數組。它可以以O(1)時間複雜度對元素進行隨機訪問。與此對應,LinkedList是以元素列表的形式存儲它的數據,每一個元素都和它的前一個和後一個元素鏈接在一起,在這種情況下,查找某個元素的時間複雜度是O(n)。
-
相對於ArrayList,LinkedList的插入,添加,刪除操作速度更快,因爲當元素被添加到集合任意位置的時候,不需要像數組那樣重新計算大小或者是更新索引。
-
LinkedList比ArrayList更佔內存,因爲LinkedList爲每一個節點存儲了兩個引用,一個指向前一個元素,一個指向下一個元素。
- 所有的數據域都是私有的.
- 沒有修改器方法
- 沒有可以返回指向可變數據域的引用的訪問器方法
35.在Java中,非靜態(匿名)內部類會引用外部類對象。而靜態內部類不會引用外部類對象。
36.Java泛型中,
- E 代表Elements,作爲容器中的元素.
- T 代表Type,作爲Java中的Class
- ? 代表未知類型.
- K 代表Key,作爲鍵.
- V 代表Value,作爲值.
-
<? extends A> 代表類型爲類A的子類.
-
<? super B> 代表類型爲B的父類.
37. 在Java中,一個弱引用指向的對象,只要被垃圾回收器掃描到就會被回收.
38.對於參數類型,要優先使用接口,而不是類.只要有適當的接口可用來定義參數,就優先使用這個接口,而不是使用實現該接口的類.例如,在編寫方` 法時使用HashMap類來作爲輸入,相反應當使用Map接口來作爲參數,這使你可以HashTable,HashMap,TreeMap來作爲參數,這樣更加靈活.
39.終結方法(finalizer)通常是不可預測的,也是很危險的,一般情況下是不必要的.使用終結方法會導致行爲不穩定,降低性能,以及可移植問題.
40.通過把字符串常量放在比較函數equals()的左側來防止NullPointerException,如下:
//Good
if("constant".equals(userVo.getName()))
//Bad
if(userVo.getName().equals("constant")
41.無論任何時候有一個集合或數組,都要確保它存在且不爲空.
42.看下一段代碼:
String a = “hello2″;
String b = “hello” + 2;
System.out.println((a == b));
輸出結果爲true. "hello" + 2在編譯期間就被優化成"hello2",因此在運行期間,a和b指向同一塊內存.
String a = “hello2″;
String b = “hello”;
String c = b + 2;
System.out.println((a == c));
輸出結果爲false.由於有符號引用的存在,c = b + 2不會在編譯期被優化,不會把b+2當做字面常量來處理,因此這種方式生成的對象是保存在heap上的.
(通過new關鍵字來生成對象是在heap segment進行的,而在heap segment進行對象生成的過程是不會檢測該對象是否已經存在的).
43.
44.
45.
36.
36.
36.
36.