標籤:java 使用 os strong 檔案 資料 for ar
1.&和&&
if(str != null& !str.equals("")){
System.out.println("ok");
}//拋null 指標異常
if(str != null&& !str.equals("")){
System.out.println("ok");
}//正常編譯
&還可以用作位元運算符,當&操作符兩邊的運算式不是boolean類型時,&表示按位與操作,我們通常使用0x0f 來與一個整數進行&運算,來擷取該整數的最低4個 bit位,例如,0x31& 0x0f 的結果為0x01。
2.標記
ok:
for (int i = 0;i < 10; i++) {
for (int j = 0;j < 10; j++) {
System.out.println("i="+ i + ",j=" + j);
if (j ==5) {
System.out.println("j==5");
break ok;
}
}
}
3. 在switch(expr1)中,expr1隻能是一個整數運算式或者枚舉常量(更大字型),整數運算式可以是int基本類型或Integer封裝類型,由於,byte,short,char都可以隱含轉換為int,所以,這些類型以及這些類型的封裝類型也是可以的。顯然,long和String類型都不符合switch的文法規定,並且不能被隱式轉換成int類型,所以,它們不能作用於swtich 語句中。
4.
short s1 = 1;
//s1 = s1 + 1;//Type mismatch: cannot convert from int toshort
//s1+1運算時會自動提升運算式的類型,所以結果是int型,再賦值給short類型 s1時,編譯器將報告需要強制轉換類型的錯誤。
short s2 = 1;
s2 += 1;
// +=是java 語言規定的運算子,java編譯器會對它進行特殊處理,因此可以正確編譯。
5.char型變數是用來儲存Unicode編碼的字元的,unicode編碼字元集中包含了漢字,所以char型變數中當然可以儲存漢字啦。不過,如果某個特殊的漢字沒有被包含在unicode編碼字元集中,那麼,這個char型變數中就不能儲存這個特殊漢字。補充說明:unicode編碼佔用兩個位元組,所以,char類型的變數也是佔用兩個位元組。
char a = ‘你‘;
System.out.println(a);
6.//用最有效率的方法算出 2乘以 8 等於幾
System.out.println(2 << 3);
將一個數左移n 位,就相當於乘以了2的n 次方,那麼,一個數乘以8隻要將其左移3位即可,而位元運算cpu直接支援的,效率最高,所以,2乘以8等於幾的最效率的方法是2 << 3。
7.設計一個一百億的計算機
int a = Integer.MAX_VALUE;
int b = Integer.MAX_VALUE;
int sum = a + b;
System.out.println("a="+a+",b="+b+",sum="+sum);
//a=2147483647,b=2147483647,sum=-2 越界
BigInteger b1 = new BigInteger("2147483647");
BigInteger b2 = new BigInteger("2147483647");
System.out.println(b1.add(b2));
//4294967294
8. 使用final 關鍵字修飾一個變數時,是指引用變數不能變,引用變數所指向的對象中的內容還是可以改變的
final StringBuffer a=new StringBuffer("immutable");
System.out.println(a);//immutable
// a=newStringBuffer(""); //編譯出錯
a.append(" broken!");
System.out.println(a);//immutablebroken!
9. "=="和 equals 方法的區別
==操作符專門用來比較兩個變數的值是否相等,也就是用於比較變數所對應的記憶體中所儲存的數值是否相同,要比較兩個基本類型的資料或兩個引用變數是否相等,只能用==操作符。
Stringa = "hello";
Stringb = "hello";
System.out.println(a == b);//true
System.out.println(a.equals(b));//true 池···
Stringc = new String("world");
Stringd = new String("world");
System.out.println(c == d);//false
System.out.println(c.equals(d));//true
Stringe = a + c;
Stringf = "helloworld";
System.out.println(e == f);//false
System.out.println(e.equals(f));//true
10. 靜態變數和執行個體變數
在文法定義上的區別:靜態變數前要加static關鍵字,而執行個體變數前則不加。
在程式運行時的區別:執行個體變數屬於某個對象的屬性,必須建立了執行個體對象,其中的執行個體變數才會被分配空間,才能使用這個執行個體變數。靜態變數不屬於某個執行個體對象,而是屬於類,所以也稱為類變數,只要程式載入了類的位元組碼,不用建立任何執行個體對象,靜態變數就會被分配空間,靜態變數就可以被使用了。總之,執行個體變數必須建立對象後才可以通過這個對象來使用,靜態變數則可以直接使用類名來引用。
11.是否可以從一個static 方法內部發出對非 static方法的調用
不可以。因為非static方法是要與對象關聯在一起的,必須建立一個對象後,才可以在該對象上進行方法調用,而 static 方法調用時不需要建立對象,可以直接調用。也就是說,當一個static方法被調用時,可能還沒有建立任何執行個體對象,如果從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪個對象上的呢?這個邏輯無法成立,所以,一個 static方法內部發出對非 static方法的調用.
12.Integer 與 int的區別
int是java提供的8種未經處理資料類型之一。 Java為每個原始類型提供了封裝類, Integer是java為int提供的封裝類。int的預設值為0,而Integer的預設值為null,即 Integer可以區分出未賦值和值為0的區別,int則無法表達出未賦值的情況,例如,要想表達出沒有參加考試和考試成績為0的區別,則只能使用Integer。在JSP開發中,Integer的預設為null,所以用el運算式在文字框中顯示時,值為空白字串,而int預設的預設值為0,所以用el 運算式在文字框中顯示時,結果為0,所以,int不適合作為web層的表單資料的類型。
在Hibernate中,如果將OID 定義為Integer類型,那麼Hibernate就可以根據其值是否為null 而判斷一個對象是否是臨時的,如果將OID 定義為了int類型,還需要在hbm對應檔中設定其unsaved-value 屬性為0。另外,Integer提供了多個與整數相關的操作方法,例如,將一個字串轉換成整數,Integer中還定義了表示整數的最大值和最小值的常量。
13.Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math 類中提供了三個與取整有關的方法:ceil、floor、round,這些方法的作用與它們的英文名稱的含義相對應,例如,ceil 的英文意義是天花板,該方法就表示向上取整,Math.ceil(11.3)的結果為12,Math.ceil(-11.3)的結果是-11;floor的英文意義是地板,該方法就表示向下取整,Math.ceil(11.6)的結果為11,Math.ceil(-11.6)的結果是-12;最難掌握的是round方法,它表示“四捨五入”,演算法為Math.floor(x+0.5),即將原來的數字加上0.5後再向下取整,所以,Math.round(11.5)的結果為12,Math.round(-11.5)的結果為-11.
14.public,private,protected範圍
範圍 |
當前類 |
同一包 |
子孫類 |
其他包 |
public |
√ |
√ |
√ |
√ |
protected |
√ |
√ |
√ |
× |
friendly |
√ |
√ |
× |
× |
private |
√ |
× |
× |
× |
如果在修飾的元素上面沒有寫任何存取修飾詞,則表示 friendly。
15.Overload 和 Override 的區別
重載 Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不同)。
重寫 Override表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子類建立的執行個體對象調用這個方法時,將調用子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是物件導向編程的多態性的一種表現。子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的存取權限只能比父類的更大,不能更小。如果父類的方法是private類型,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。
16.構造器Constructor不能被繼承,因此不能重寫Override,但可以被重載Overload。
17.介面可以繼承介面。抽象類別可以實現(implements)介面,抽象類別可以繼承具體類。抽象類別中可以有靜態main 方法。抽象類別與普通類的唯一區別:抽象類別不能建立執行個體對象和允許有abstract方法。
18.寫 clone()方法時,通常都有一行代碼,super.clone();
clone 有預設行為。首先要把父類中的成員複製到位,然後才是複製自己的成員。
19.物件導向的特徵
封裝:實現軟體組件的“高內聚、低耦合”,防止程式相互依賴而帶來的變動影響。在物件導向的程式設計語言中,對象是封裝的最基本單位,物件導向的封裝比傳統語言的封裝更為清晰、更為有力。物件導向的封裝就是把描述一個對象的屬性和興味的代碼封裝在一個“class”中,屬性用變數定義,行為用方法定義,方法可以直接存取同一個對象的屬性。
繼承:在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,並可以加入若干新的內容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類自動共用父類資料和方法的機制,這是類之間的一種關係,提高了軟體的可重用性和可擴充性。
多態:多態是指程式中定義的引用變數所指向的具體類型和通過該引用變數發出的方法調用在編程時並不確定,而是在程式運行期間才確定,即一個引用變數倒底會指向哪個類的執行個體對象,該引用變數發出的方法調用到底是哪個類中實現的方法,必須在由程式運行期間才能決定。因為在程式運行時才確定具體的類,這樣,不用修改來源程式代碼,就可以讓引用變數綁定到各種不同的類實現上,從而導致該引用調用的具體方法隨之改變,即不修改程式碼就可以改變程式運行時所綁定的具體代碼,讓程式可以選擇多個運行狀態,這就是多態性。多態性增強了軟體的靈活性和擴充性。
20.Java中實現多態的機制
靠的是父類或介面定義的引用變數可以指向子類或具體實作類別的執行個體對象,而程式調用的方法在運行期才動態綁定,就是引用變數所指向的具體執行個體對象的方法,也就是記憶體裡正在啟動並執行那個對象的方法,而不是引用變數的類型中定義的方法。
21.abstract class和 interface 的區別
含有 abstract修飾符的class即為抽象類別,abstract類不能建立的執行個體對象。含有abstract方法的類必須定義為abstract class, abstract class類中的方法不必是抽象的。abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,所以,不能有抽象構造方法或抽象靜態方法。如果的子類沒有實現抽象父類中的所有抽象方法,那麼子類也必須定義為abstract類型。
介面(interface)是抽象類別的一種特例,介面中的所有方法都必須是抽象的。介面中的方法定義預設為publicabstract類型,介面中的成員變數類型預設為publicstatic final。
抽象類別和介面的文法區別
① 象類可以有構造方法,介面不能有構造方法。
② 抽象類別中可以有普通成員變數,介面中沒有普通成員變數。
③ 抽象類別中可以有非抽象的普通方法,介面中所有的方法必須的抽象的,不能有非抽象的普通方法。
④ 抽象類別中的抽象方法的訪問類型可以是public、protected和預設類型(eclipse不報錯,但應該也不行),但介面中的抽象方法只能是public的,並且預設即為public abstract類型。
⑤ 抽象類別中可以包含靜態方法,介面中不可以包含靜態方法。
⑥ 抽象類別和介面中都可以包含靜態成員變數,抽象類別中的靜態成員變數的訪問類型可以任意,但節後中定義的變數只能是public static final類型,並且預設即為此類型。
⑦ 一個類可以實現多個介面,但只能繼承一個類。
抽象類別和介面的應用區別
介面更多的是在系統架構設計方法發揮作用,主要用於定義模組之間的通訊契約。而抽象類別在代碼實現方面發揮作用,可以實現代碼的重用。父類方法中間的某段代碼不確定,留給子類幹,就用模板方法設計模式。