開篇語:這篇文章是 java面試那件小事 系列文章的第一篇。該系列的文章將所有的讀者都想象成是一個初學者,由淺入深的引入java相關的一些問題。這些問題都是sandeziVIP和朋友一起整理,或在群裡或在論壇或查閱網路收集的一些出現頻率較高且重要,當然也是必須要掌握的內容。如果你認為i你已經超出初學者了,卻不是很懂每篇文章開頭引入的幾個問題,請把自己重歸到初學者的行列。
java基礎知識篇將涉及到 物件導向基本,操作符,控制執行流程以及初始化相關的內容。
問題:
- 物件導向的特徵有哪些方面?
- Integer與int的區別?
- short num = 1;num = num+1;有什麼錯?short num =1 ; num +=1;有沒有錯?
- &和&&的區別?以及用最有效率的方法算出2乘以8等於幾
- 靜態變數和執行個體變數的區別
- equals()和==到底有什麼區別?
- Overloaded和Override的區別。Overloaded的方法是否可以改變傳回值的類型?
- fianl,finally,finalize的區別?
分析和解答:
物件導向的特徵有哪些方面?學習java一開始接觸的概念應該就是物件導向了,那麼什麼是物件導向,物件導向有哪些特點,物件導向編程有哪些好處?提到物件導向,諸如此類的問題一定也會撲面而來,但是個人認為物件導向畢竟是一種思想,沒有長期的接觸應用和體會還是很難用簡短的文字去告訴你有關物件導向的這樣那樣的問題。但有一點可以肯定,熟記物件導向的特徵,對你日後逐步深化物件導向的理解有很大的協助。所以這一部分我還是以教科書的方式給出官方的答案:
- 抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算瞭解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是資料抽象。
- 繼承:繼承是一種連接類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的衍生類別(子類),而原始類稱為新類的基類(父類)。衍生類別可以從它的基類那裡繼承方法和執行個體變數,並且類可以修改或增加新的方法使之更適合特殊的需要。
- 封裝:封裝是把過程和資料包圍起來,對資料的訪問只能通過已定義的介面。物件導向計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的介面訪問其他對象。
- 多態性:多態性是指允許不同類的對象對同一訊息作出響應。多態性包括參數化多態性和包含多態性。多態性語言具有靈活、抽象、行為共用、代碼共用的優勢,很好的解決了應用程式函數同名問題。
基本理清這方面的概念之後,推薦大家看看這篇文章:程式員必備的七大物件導向原則
Integer與int的區別?
Java 提供兩種不同的類型:參考型別和原始類型(或內建類型)。Int是java的未經處理資料類型,Integer是java為int提供的封裝類。Java為每個原始類型提供了封裝類。參考型別和原始類型的行為完全不同,並且它們具有不同的語義。參考型別和原始類型具有不同的特徵和用法,它們包括:大小和速度問題,這種類型以哪種類型的資料結構儲存,當參考型別和原始類型用作某個類的執行個體資料時所指定的預設值。對象引用執行個體變數的預設值為 null,而原始類型執行個體變數的預設值與它們的類型有關。在jsp開發中,Integer的預設值為null,所以用el運算式在文字框中顯示時,值為null;而int預設為0,所以在el運算式在文字框中顯示時,結果為0,所以int不適合作為web層的表單資料的類型(具體見下表)。
基本類型 |
大 小 |
最小值 |
最大值 |
封裝類型 |
boolean |
— |
— |
— |
Boolean |
char |
16bits(2位元組) |
Unicode 0 |
Unicode 2^16-1 |
Character |
byte |
8bits(1位元組) |
-128 |
127 |
Byte |
short |
16bits(2位元組) |
-2^15 |
+2^15-1 |
Short |
int |
32bits(4位元組) |
-2^31 |
+2^31-1 |
Integer |
long |
64bits(8位元組) |
-2^63 |
+2^63-1 |
Long |
float |
32bits(4位元組) |
IEEE754標準 |
IEEE754 |
Float |
double |
64bits(8位元組) |
IEEE754 |
IEEE754 |
Double |
- 所有數實值型別都有加號或減號,所以不要去尋找無符號的數實值型別
- boolean類型所佔用儲存空間的大小沒有明確指定,僅定義為能夠取字面值true或false
short num = 1;num = num+1;有什麼錯?short num =1 ; num +=1;有沒有錯?
short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換類型,這樣子才可以正確的編譯) short s1 = 1; s1 += 1;(可以正確編譯)
&和&&的區別?以及用最有效率的方法算出2乘以8等於幾
&和&&都可以作為邏輯運算子,表示邏輯與(and),當運算子兩邊的運算式結構都為true時,運算結果才為true,否則,只要有一方為false,則結果為false。
&&又叫做短路與,即如果第一個運算式為false,則不再計算第二個運算式,例如,對於 if(!str=null&&!str.equals(""))運算式,當str為null時,後面的運算式不會執行,所以就不會出現NullPoninterException異常,如果將&&改為&,則會拋出null 指標異常。
&還可以用作位元運算符,當&操作符兩邊的運算式不是boolean類型時,&表示按位與操作。
2<<3應該是2*8的最有效率的運算方式。因為,將一個數左移n位,就相當於乘以了2的n次方,那麼一個數乘以8隻要將其左移3位即可。而位元運算(<<)是cpu支援的,效率也就最高。
靜態變數和執行個體變數的區別?
有static關鍵字修飾的變數叫做靜態變數,因為其建立只是作為整個類而不是某個特定對象而存在,所以也叫做類變數。反之沒有被static修飾的變數則叫做執行個體變數。
類變數和執行個體變數的區別:
- 一個static變數對每個類來說只有一份儲存空;而非static變數(執行個體變數)則是對每個對象都有一個儲存空間
- static變數即可以通過一個對象去定位它,也可以空過其類名直接引用;而對於非static變數則只能通過對象去引用
看下面這個例子:
class TestStatic{static int i = 5;}現在建立兩個TestSatic對象TestStatic ts1 = new TestStatic();TestStatic ts2 = new TestStatic();這裡 ts1.i 和 ts2.1 指向同一儲存空間,因此他們具有相同的值5如果要引用static變數i的話,既可以通過一個對象去定位,如同ts1.i;也可以通過其類名直接引用,如TestStatic.i,這個對於非靜態變數時非法的
equals()和==到底有什麼區別?
==操作比較的是兩個變數的值是否相等,對於引用型變數表示的是兩個變數在堆中儲存的地址是否相同,即棧中的內容是否相同。
equals動作表示的兩個變數是否是對同一個對象的引用,即堆中的內容是否相同。
==比較的是2個對象的地址,而equals比較的是2個對象的內容。
深入瞭解此題詳見sandeziVIP早前的博文:從equals和==說起
Overloaded和Override的區別。Overloaded的方法是否可以改變傳回值的類型?
overloaded表示重載,即在類中可以建立多個方法,它們具有相同的方法名,但具有不同的參數類型列表;Override表示重寫,即子類中定義了與基類中具有相同名稱和參數列表的方法,此時基類的中的該方法將被隱藏。
深入瞭解此題詳見sandeziVIP的博文 :關於java方法的重載(Overloading),覆寫(Override)以及final
方法的幾點說明
fianl,finally,finalize的區別?
final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉檔案等。
PS:
本系列文章都遵循永久更新原則,發現新的東西都會及時加入,所以依舊希望大家積極討論,不吝賜教。
另遇到問題較為繁瑣且重要都會單獨成文以說明之。
本系列文章更新列表入口:java面試那件小事
此文屬http://blog.csdn.net/sandeziVIP搜集整理,任何形式的轉載或引用請註明出處!