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異常,如果將&&改為&,則會拋出空指針異常。
&還可以用作位運算符,當&操作符兩邊的表達式不是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:
本系列文章都遵循永久更新原則,發現新的東西都會及時加入,所以依舊希望大家積極討論,不吝賜教。
另遇到問題較為繁瑣且重要都會單獨成文以說明之。