- 在JAVA中如何跳出當(dāng)前的多重嵌套循環(huán)?
在Java中,要想跳出多重循環(huán)虱岂,可以在外面的循環(huán)語(yǔ)句前定義一個(gè)標(biāo)號(hào),然后在里層循環(huán)體的代碼中使用帶有標(biāo)號(hào)的break語(yǔ)句菠红,即可跳出外層循環(huán)第岖。例如:
public static void main(String[] args) {
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) break ok;
}
}
}
- **switch語(yǔ)句能否作用在byte上,能否作用在long上试溯,能否作用在String上? **
在switch(expr1)中蔑滓,expr1只能是一個(gè)整數(shù)表達(dá)式或者枚舉常量,整數(shù)表達(dá)式可以是int基本類(lèi)型或Integer包裝類(lèi)型,由于烫饼,byte,short,char都可以隱含轉(zhuǎn)換為int猎塞,所以,這些類(lèi)型以及這些類(lèi)型的包裝類(lèi)型也是可以的杠纵。顯然荠耽,long(超出int數(shù)量級(jí)轉(zhuǎn)成int要損失精度)和String類(lèi)型(不是基本類(lèi)型)都不符合switch的語(yǔ)法規(guī)定,并且不能被隱式轉(zhuǎn)換成int類(lèi)型比藻,所以铝量,它們不能作用于swtich語(yǔ)句中。 -
short s1 = 1; s1 = s1 + 1;有什么錯(cuò)? short s1 = 1; s1 += 1;有什么錯(cuò)?
對(duì)于short s1 = 1; s1 = s1 + 1;由于s1+1運(yùn)算時(shí)會(huì)自動(dòng)提升表達(dá)式的類(lèi)型(取精度大的)银亲,所以結(jié)果是int型慢叨,再賦值給short類(lèi)型s1時(shí),編譯器將報(bào)告需要強(qiáng)制轉(zhuǎn)換類(lèi)型的錯(cuò)誤务蝠。
對(duì)于short s1 = 1; s1 += 1;由于 +=是java語(yǔ)言規(guī)定的運(yùn)算符拍谐,java編譯器會(huì)對(duì)它進(jìn)行特殊處理,因此可以正確編譯(可以理解為此處也是賦值操作馏段,所以沒(méi)有轉(zhuǎn)型問(wèn)題轩拨,a += b; //相當(dāng)于 a = (short)(a+b);)。 -
用最有效率的方法算出2乘以8等於幾?
System.out.print(2<<3);
位運(yùn)算快院喜,因?yàn)閷⒁粋€(gè)數(shù)左移n位亡蓉,就相當(dāng)于乘以了2的n次方,那么喷舀,一個(gè)數(shù)乘以8只要將其左移3位即可砍濒,而位運(yùn)算cpu直接支持的,效率最高硫麻,所以爸邢,2乘以8等於幾的最效率的方法是2<<3。 - ** Integer與int的區(qū)別拿愧?**
int是java提供的8種原始數(shù)據(jù)類(lèi)型之一甲棍。Java為每個(gè)原始類(lèi)型提供了封裝類(lèi),Integer是java為int提供的封裝類(lèi)赶掖。int的默認(rèn)值為0感猛,而Integer的默認(rèn)值為null,即Integer可以區(qū)分出未賦值和值為0的區(qū)別奢赂,int則無(wú)法表達(dá)出未賦值的情況陪白,例如,要想表達(dá)出沒(méi)有參加考試和考試成績(jī)?yōu)?的區(qū)別膳灶,則只能使用Integer咱士。在JSP開(kāi)發(fā)中立由,Integer的默認(rèn)為null,所以用el表達(dá)式在文本框中顯示時(shí)序厉,值為空白字符串锐膜,而int默認(rèn)的默認(rèn)值為0,所以用el表達(dá)式在文本框中顯示時(shí)弛房,結(jié)果為0道盏,所以,int不適合作為web層的表單數(shù)據(jù)的類(lèi)型文捶。另外荷逞,Integer提供了多個(gè)與整數(shù)相關(guān)的操作方法,例如粹排,將一個(gè)字符串轉(zhuǎn)換成整數(shù)种远,Integer中還定義了表示整數(shù)的最大值和最小值的常量。 -
接口是否可繼承接口?抽象類(lèi)是否可實(shí)現(xiàn)(implements)接口?抽象類(lèi)是否可繼承具體類(lèi)(concrete class)?抽象類(lèi)中是否可以有靜態(tài)的main方法顽耳?
接口可以繼承接口坠敷。
抽象類(lèi)可以實(shí)現(xiàn)(implements)接口,抽象類(lèi)是可以繼承具體類(lèi)射富。
抽象類(lèi)中可以有靜態(tài)的main方法常拓。 -
java中實(shí)現(xiàn)多態(tài)的機(jī)制是什么?
靠的是父類(lèi)或接口定義的引用變量可以指向子類(lèi)或具體實(shí)現(xiàn)類(lèi)的實(shí)例對(duì)象辉浦,而程序調(diào)用的方法在運(yùn)行期才動(dòng)態(tài)綁定,就是引用變量所指向的具體實(shí)例對(duì)象的方法茎辐,也就是內(nèi)存里正在運(yùn)行的那個(gè)對(duì)象的方法宪郊,而不是引用變量的類(lèi)型中定義的方法。 -
內(nèi)部類(lèi)可以引用它的包含類(lèi)的成員嗎拖陆?有沒(méi)有什么限制弛槐?
完全可以。如果不是靜態(tài)內(nèi)部類(lèi)依啰,那沒(méi)有什么限制乎串!
如果你把靜態(tài)嵌套類(lèi)當(dāng)作內(nèi)部類(lèi)的一種特例,那在這種情況下不可以訪(fǎng)問(wèn)外部類(lèi)的普通成員變量速警,而只能訪(fǎng)問(wèn)外部類(lèi)中的靜態(tài)成員叹誉。 -
super.getClass()方法調(diào)用?
下面程序的輸出結(jié)果是多少闷旧?
importjava.util.Date;
public classTestextends Date{
public static voidmain(String[] args) {
new Test().test();
}
public void test(){
System.out.println(super.getClass().getName());
}
}
很奇怪长豁,結(jié)果是Test
這屬于腦筋急轉(zhuǎn)彎的題目,在一個(gè)qq群有個(gè)網(wǎng)友正好問(wèn)過(guò)這個(gè)問(wèn)題忙灼,我覺(jué)得挺有趣匠襟,就研究了一下钝侠,沒(méi)想到今天還被你面到了,哈哈酸舍。
在test方法中帅韧,直接調(diào)用getClass().getName()方法,返回的是Test類(lèi)名
由于getClass()在Object類(lèi)中定義成了final啃勉,子類(lèi)不能覆蓋該方法忽舟,所以,在
test方法中調(diào)用getClass().getName()方法璧亮,其實(shí)就是在調(diào)用從父類(lèi)繼承的getClass()方法萧诫,等效于調(diào)用super.getClass().getName()方法,所以枝嘶,super.getClass().getName()方法返回的也應(yīng)該是Test帘饶。
如果想得到父類(lèi)的名稱(chēng),應(yīng)該用如下代碼:
getClass().getSuperClass().getName();
-
String s = 'Hello';s = s + ' world!';這兩行代碼執(zhí)行后群扶,原始的String對(duì)象中的內(nèi)容到底變了沒(méi)有及刻?
沒(méi)有。因?yàn)镾tring被設(shè)計(jì)成不可變(immutable)類(lèi)竞阐,所以它的所有對(duì)象都是不可變對(duì)象缴饭。在這段代碼中,s原先指向一個(gè)String對(duì)象骆莹,內(nèi)容是 'Hello'颗搂,然后我們對(duì)s進(jìn)行了+操作,那么s所指向的那個(gè)對(duì)象是否發(fā)生了改變呢幕垦?答案是沒(méi)有丢氢。這時(shí),s不指向原來(lái)那個(gè)對(duì)象了先改,而指向了另一個(gè) String對(duì)象疚察,內(nèi)容為'Hello world!',原來(lái)那個(gè)對(duì)象還存在于內(nèi)存之中仇奶,只是s這個(gè)引用變量不再指向它了貌嫡。
通過(guò)上面的說(shuō)明,我們很容易導(dǎo)出另一個(gè)結(jié)論该溯,如果經(jīng)常對(duì)字符串進(jìn)行各種各樣的修改岛抄,或者說(shuō),不可預(yù)見(jiàn)的修改狈茉,那么使用String來(lái)代表字符串的話(huà)會(huì)引起很大的內(nèi)存開(kāi)銷(xiāo)弦撩。因?yàn)?String對(duì)象建立之后不能再改變,所以對(duì)于每一個(gè)不同的字符串论皆,都需要一個(gè)String對(duì)象來(lái)表示益楼。這時(shí)猾漫,應(yīng)該考慮使用StringBuffer類(lèi),它允許修改感凤,而不是每個(gè)不同的字符串都要生成一個(gè)新的對(duì)象悯周。并且,這兩種類(lèi)的對(duì)象轉(zhuǎn)換十分容易陪竿。同時(shí)禽翼,我們還可以知道,如果要使用內(nèi)容相同的字符串族跛,不必每次都new一個(gè)String闰挡。例如我們要在構(gòu)造器中對(duì)一個(gè)名叫s的String引用變量進(jìn)行初始化,把它設(shè)置為初始值礁哄,應(yīng)當(dāng)這樣做:
public class Demo {
private String s;
public Demo {
s = 'Initial Value';
}
}
而非
s = new String('Initial Value');
后者每次都會(huì)調(diào)用構(gòu)造器长酗,生成新對(duì)象,性能低下且內(nèi)存開(kāi)銷(xiāo)大桐绒,并且沒(méi)有意義夺脾,因?yàn)镾tring對(duì)象不可改變,所以對(duì)于內(nèi)容相同的字符串茉继,只要一個(gè)String對(duì)象來(lái)表示就可以了咧叭。也就說(shuō),多次調(diào)用上面的構(gòu)造器創(chuàng)建多個(gè)對(duì)象烁竭,他們的String類(lèi)型屬性s都指向同一個(gè)對(duì)象菲茬。上面的結(jié)論還基于這樣一個(gè)事實(shí):對(duì)于字符串常量,如果內(nèi)容相同派撕,Java認(rèn)為它們代表同一個(gè)String對(duì)象婉弹。而用關(guān)鍵字new調(diào)用構(gòu)造器,總是會(huì)創(chuàng)建一個(gè)新的對(duì)象腥刹,無(wú)論內(nèi)容是否相同。至于為什么要把String類(lèi)設(shè)計(jì)成不可變類(lèi)汉买,是它的用途決定的衔峰。其實(shí)不只String姜胖,很多Java標(biāo)準(zhǔn)類(lèi)庫(kù)中的類(lèi)都是不可變的密幔。在開(kāi)發(fā)一個(gè)系統(tǒng)的時(shí)候鸦难,我們有時(shí)候也需要設(shè)計(jì)不可變類(lèi)凯砍,來(lái)傳遞一組相關(guān)的值秕铛,這也是面向?qū)ο笏枷氲捏w現(xiàn)冠桃。不可變類(lèi)有一些優(yōu)點(diǎn)搏恤,比如因?yàn)樗膶?duì)象是只讀的攘烛,所以多線(xiàn)程并發(fā)訪(fǎng)問(wèn)也不會(huì)有任何問(wèn)題舔痕。當(dāng)然也有一些缺點(diǎn)评抚,比如每個(gè)不同的狀態(tài)都要一個(gè)對(duì)象來(lái)代表豹缀,可能會(huì)造成性能上的問(wèn)題。所以Java標(biāo)準(zhǔn)類(lèi)庫(kù)還提供了一個(gè)可變版本慨代,即 StringBuffer邢笙。
-
下面這條語(yǔ)句一共創(chuàng)建了多少個(gè)對(duì)象:String s='a'+'b'+'c'+'d'?
String s1 = 'a';
String s2 = s1 + 'b';
String s3 = 'a' + 'b';
System.out.println(s2 == 'ab');
System.out.println(s3 == 'ab');
第一條語(yǔ)句打印的結(jié)果為false侍匙,第二條語(yǔ)句打印的結(jié)果為true氮惯,這說(shuō)明javac編譯可以對(duì)字符串常量直接相加的表達(dá)式進(jìn)行優(yōu)化,不必要等到運(yùn)行期去進(jìn)行加法運(yùn)算處理想暗,而是在編譯時(shí)去掉其中的加號(hào)妇汗,直接將其編譯成一個(gè)這些常量相連的結(jié)果。
題目中的第一行代碼被編譯器在編譯時(shí)優(yōu)化后说莫,相當(dāng)于直接定義了一個(gè)”abcd”的字符串杨箭,所以,上面的代碼應(yīng)該只創(chuàng)建了一個(gè)String對(duì)象唬滑。寫(xiě)如下兩行代碼告唆,
String s ='a' + 'b' + 'c' + 'd';
System.out.println(s== 'abcd');
最終打印的結(jié)果應(yīng)該為true。 - **Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用晶密。