javaee面試題
面試題是一種被廣泛采用的java人才測(cè)評(píng)工具,那你知道java面試的時(shí)候會(huì)出什么題目嗎?下面是由學(xué)習(xí)啦小編分享的javaee面試題,希望對(duì)你有用。
javaee面試題(一)
常量定義的基本注意事項(xiàng)
答案
在Java語言中,主要是利用final關(guān)鍵字(在Java類中靈活使用Static關(guān)鍵字)來定義常量。當(dāng)常量被設(shè)定后,一般情況下就不允許再進(jìn)行更改。如可以利用如下的形式來定義一個(gè)常量:final double PI=3.1315。在定義這個(gè)常量時(shí),需要注意如下內(nèi)容:
一是常量在定義的時(shí)候,就需要對(duì)常量進(jìn)行初始化。也就是說,必須要在常量聲明時(shí)對(duì)其進(jìn)行初始化。都跟局部變量或者成員變量不同。當(dāng)在常量定義的時(shí)候初始化過后,在應(yīng)用程序中就無法再次對(duì)這個(gè)常量進(jìn)行賦值。如果強(qiáng)行賦值的話,數(shù)據(jù)庫(kù)會(huì)跳出錯(cuò)誤信息,并拒絕接受這一個(gè)新的值。(接口中定義的常量的訪問方法)
二是final關(guān)鍵字使用的范圍。這個(gè)final關(guān)鍵字不僅可以用來修飾基本數(shù)據(jù)類型的常量,還可以用來修飾對(duì)象的引用或者方法。如數(shù)組就是一個(gè)對(duì)象引用。為此可以使用final關(guān)鍵字來定義一個(gè)常量的數(shù)組。這就是Java語言中一個(gè)很大的特色。一旦一個(gè)數(shù)組對(duì)象被final關(guān)鍵字設(shè)置為常量數(shù)組之后,它只能夠恒定的指向一個(gè)數(shù)組對(duì)象,無法將其改變指向另外一個(gè)對(duì)象,也無法更改數(shù)組(有序數(shù)組的插入方法可使用的二分查找算法)中的值。
三是需要注意常量的命名規(guī)則。不同的語言,在定義變量或者常量的時(shí)候,都有自己一套編碼規(guī)則。 這主要是為了提高代碼的共享程度與提高代碼的易讀性。在Java語言中,定義常量的時(shí)候,也有自己的一套規(guī)則。如在給常量取名的時(shí)候,一般都用大寫字符。 在Java語言中,大小寫字符是敏感的。之所以采用大寫字符,主要是跟變量進(jìn)行區(qū)分。雖然說給常量取名時(shí)采用小寫字符,也不會(huì)有語法上的錯(cuò)誤。但是,為了 在編寫代碼時(shí)能夠一目了然的判斷變量與常量,最好還是能夠?qū)⒊A吭O(shè)置為大寫字符。另外,在常量中,往往通過下劃線來分隔不同的字符。而不想對(duì)象名或者類名 那樣,通過首字符大寫的方式來進(jìn)行分隔。這些規(guī)則雖然不是強(qiáng)制性的規(guī)則,但是為了提高代碼友好性,方便開發(fā)團(tuán)隊(duì)中的其他成員閱讀,這些規(guī)則還是需要遵守 的。沒有規(guī)矩,不成方圓。
總之,Java開發(fā)人員需要注意,被定義為final的常量需要采用大寫字母命名,并且中間最好使用下劃線作為分隔符來進(jìn)行連接多個(gè)單詞。在定義final的數(shù)據(jù)不論是常量、對(duì)象引用還是數(shù)組,在主函數(shù)中都不可以改變。否則的話,會(huì)被編輯器拒絕并提示錯(cuò)誤信息。
javaee面試題(二)
Final關(guān)鍵字與static關(guān)鍵字同時(shí)使用。
答案
由于Javal是面向?qū)ο蟮恼Z言,所以在定義常量的時(shí)候還有與其它編程語言不同的地方。如一段程序代碼從編輯到最后執(zhí)行,即使需要經(jīng)過兩個(gè)過程,分別為代碼的裝載與對(duì)象的建立。不同的過程對(duì)于常量的影響是不同的。現(xiàn)在假設(shè)有如下的代碼:
Private static Random rd1=new Random(); //實(shí)例化一個(gè)隨機(jī)數(shù)生成對(duì)象。
Private final int int1=rd1.nestInt(10); //生成隨機(jī)數(shù)并賦值給常量int1
Private static final int int2=rd1.nestInt(10); //生成隨機(jī)數(shù)并賦值給常量int2
這上面的語句的大致含義是,通過Java語言提供的隨機(jī)數(shù)類對(duì)象,生成隨機(jī)數(shù)。并把生成的隨機(jī)數(shù)賦值給常量int1與int2。細(xì)心的讀者會(huì)發(fā)現(xiàn),雖然 同樣是賦值語句,但是以上兩個(gè)語句中有一個(gè)細(xì)小的差別,即在第二條語句中多了一個(gè)關(guān)鍵字static。關(guān)于關(guān)鍵字的用途,筆者在以前的文章中也有談到過。 這個(gè)是一個(gè)靜態(tài)的概念。即當(dāng)利用這個(gè)關(guān)鍵字來修飾一個(gè)變量的時(shí)候,在創(chuàng)建對(duì)象之前就會(huì)為這個(gè)變量在內(nèi)存中創(chuàng)建一個(gè)存儲(chǔ)空間。以后創(chuàng)建對(duì)對(duì)象如果需要用到這 個(gè)靜態(tài)變量,那么就會(huì)共享這一個(gè)變量的存儲(chǔ)空間。也就是說,在創(chuàng)建對(duì)象的時(shí)候,如果用到這個(gè)變量,那么系統(tǒng)不會(huì)為其再分配一個(gè)存儲(chǔ)空間,而只是將這個(gè)內(nèi)存 存儲(chǔ)空間的地址賦值給他。如此做的好處就是可以讓多個(gè)對(duì)象采用相同的初始變量。當(dāng)需要改變多個(gè)對(duì)象中變量值的時(shí)候,只需要改變一次即可。從這個(gè)特性上來 說,其跟常量的作用比較類似。不過其并不能夠取代常量的作用。
那么以上兩條語句有什么差別嗎?我們首先來看Private final int
int1=rd1.nestInt(10)這條語句。雖然int1也是一個(gè)常量,但是其是在對(duì)象建立的時(shí)候初始化的。如現(xiàn)在需要?jiǎng)?chuàng)建兩個(gè)對(duì)象,那么需要對(duì) 這個(gè)變量初始化兩次。而在兩次對(duì)象初始化的過程中,由于生成的隨機(jī)數(shù)不同,所以常量初始化的值也不同。最后導(dǎo)致的結(jié)果就是,雖然int1是常量,但是在不 同對(duì)象中,其值有可能是不同的??梢姡x為final的常量并不是恒定不變的。因?yàn)槟J(rèn)情況下,定義的常量是在對(duì)象建立的時(shí)候被初始化。如果在建立常量 時(shí),直接賦一個(gè)固定的值,而不是通過其他對(duì)象或者函數(shù)來賦值,那么這個(gè)常量的值就是恒定不變的,即在多個(gè)對(duì)象中值也使相同的。但是如果在給常量賦值的時(shí) 候,采用的是一些函數(shù)或者對(duì)象(如生成隨機(jī)數(shù)的Random對(duì)象),那么每次建立對(duì)象時(shí)其給常量的初始化值就有可能不同。這往往是程序開發(fā)人員不原意看到 的。有時(shí)候程序開發(fā)人員希望建立再多的對(duì)象,其在多個(gè)對(duì)象中引用常量的值都是相同的。
要是現(xiàn)這個(gè)需求的話,有兩個(gè)方法。一是在給常量 賦值的時(shí)候,直接賦予一個(gè)固定的值,如abcd等等。而不是一個(gè)會(huì)根據(jù)環(huán)境變化的函數(shù)或者對(duì)象。像生成隨機(jī)數(shù)的對(duì)象,每次運(yùn)行時(shí)其結(jié)果都有可能不能。利用 這個(gè)對(duì)象來對(duì)常量進(jìn)行初始化的時(shí)候,那么結(jié)果可能每次創(chuàng)建對(duì)象時(shí)這個(gè)結(jié)果都有可能不同。最后這個(gè)常量只能夠做到在一個(gè)對(duì)象內(nèi)是恒定不變的,而無法做到在一 個(gè)應(yīng)用程序內(nèi)是恒定不變的。另外一個(gè)方法就是將關(guān)鍵字static與關(guān)鍵字final同時(shí)使用。一個(gè)被定義為final的對(duì)象引用或 者常量只能夠指向唯一的一個(gè)對(duì)象,不可以將他再指向其他對(duì)象。但是,正如上面舉的一個(gè)隨機(jī)數(shù)的例子,對(duì)象本身的內(nèi)容的值是可以改變的。為了做到一個(gè)常量在 一個(gè)應(yīng)用程序內(nèi)真的不被更改,就需要將常量聲明為staitc final的常量。這是什么意思呢?正如上面筆者所說的,當(dāng)執(zhí)行一個(gè)應(yīng)用程序的時(shí)候,可以分為兩個(gè)步驟,分別為代碼裝載與對(duì)象創(chuàng)建。為了確保在所有情況下 (即創(chuàng)建多個(gè)對(duì)象情況下)應(yīng)用程序還能夠得到一個(gè)相同值的常量,那么就最好告訴編譯器,在代碼裝載的時(shí)候就初始化常量的值。然后在后續(xù)創(chuàng)建對(duì)象的時(shí)候,只 引用這個(gè)常量對(duì)象的地址,而不對(duì)其再進(jìn)行再次初始化。就如同Private static final int int2=rd1.nestInt(10)這種形式來定義常量。如此,在后續(xù)多次創(chuàng)建對(duì)象后,這個(gè)常量int2的值都是相同的。因?yàn)樵趧?chuàng)建對(duì)象時(shí),其只是 引用這個(gè)常量,而不會(huì)對(duì)這個(gè)常量再次進(jìn)行初始化。
由于加上這個(gè)static關(guān)鍵字之后,相當(dāng)于改變了常量的作用范圍。為此程序開發(fā)人 員需要了解自己的需求,然后選擇是否需要使用這個(gè)關(guān)鍵字。在初始化常量的時(shí)候,如果采用函數(shù)(如系統(tǒng)當(dāng)前時(shí)間)或者對(duì)象(如生成隨機(jī)數(shù)的對(duì)象)來初始化常 量,可以預(yù)見到在每次初始化這個(gè)常量時(shí)可能得到不同的值,就需要考慮是否要采用這個(gè)static關(guān)鍵字。一般情況下,如果只需要保證在對(duì)象內(nèi)部采用這個(gè)常 量的話,那么這個(gè)關(guān)鍵字就可有可無的。但是反過來,如果需要在多個(gè)對(duì)象中引用這個(gè)常量,并且需要其值相同,那么就必須要采用static這個(gè)關(guān)鍵字了。以 確保不同對(duì)象中都只有一個(gè)常量的值。或者說,不同對(duì)象中引用的常量其實(shí)指向的是內(nèi)存中的同一塊區(qū)域。
javaee面試題(三)
1. Java基礎(chǔ)部分
基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語法,集合的語法,io的語法,虛擬機(jī)方面的語法。
1、一個(gè)".java"源文件中是否可以包括多個(gè)類(不是內(nèi)部類)?有什么限制?
可以有多個(gè)類,但只能有一個(gè)public的類,并且public的類名必須與文件名相一致。
2、Java有沒有g(shù)oto?
java中的保留字,現(xiàn)在沒有在java中使用。
3、說說&和&&的區(qū)別。
&和&&都可以用作邏輯與的運(yùn)算符,表示邏輯與(and),當(dāng)運(yùn)算符兩邊的表達(dá)式的結(jié)果都為true時(shí),整個(gè)運(yùn)算結(jié)果才為true,否則,只要有一方為false,則結(jié)果為false。 &&還具有短路的功能,即如果第一個(gè)表達(dá)式為false,則不再計(jì)算第二個(gè)表達(dá)式。
&還可以用作位運(yùn)算符,當(dāng)&操作符兩邊的表達(dá)式不是boolean類型時(shí),&表示按位與操作。
4、在JAVA中如何跳出當(dāng)前的多重嵌套循環(huán)?
在Java中,要想跳出多重循環(huán),可以在外面的循環(huán)語句前定義一個(gè)標(biāo)號(hào),然后在里層循環(huán)體的代碼中使用帶有標(biāo)號(hào)的break語句,即可跳出外層循環(huán)。
5、switch語句能否作用在byte上,能否作用在long上,能否作用在String上?
在switch(expr1)中,expr1只能是一個(gè)整數(shù)表達(dá)式或者枚舉常量(更大字體),整數(shù)表達(dá)式可以是int基本類型或Integer包裝類型,由于,byte,short,char都可以隱含轉(zhuǎn)換為int,所以,這些類型以及這些類型的包裝類型也是可以的。顯然,long和String類型都不符合switch的語法規(guī)定,并且不能被隱式轉(zhuǎn)換成int類型,所以,它們不能作用于swtich語句中。
6、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á)式的類型,所以結(jié)果是int型,再賦值給short類型s1時(shí),編譯器將報(bào)告需要強(qiáng)制轉(zhuǎn)換類型的錯(cuò)誤。
對(duì)于short s1 = 1; s1 += 1;由于 +=是java語言規(guī)定的運(yùn)算符,java編譯器會(huì)對(duì)它進(jìn)行特殊處理,因此可以正確編譯。
7、char型變量中能不能存貯一個(gè)中文漢字?為什么?
char型變量是用來存儲(chǔ)Unicode編碼的字符的,unicode編碼字符集中包含了漢字,所以,char型變量中當(dāng)然可以存儲(chǔ)漢字啦。不過,如果某個(gè)特殊的漢字沒有被包含在unicode編碼字符集中,那么,這個(gè)char型變量中就不能存儲(chǔ)這個(gè)特殊漢字。補(bǔ)充說明:unicode編碼占用兩個(gè)字節(jié),所以,char類型的變量也是占用兩個(gè)字節(jié)。
8、用最有效率的方法算出2乘以8等於幾?
2 << 3,
10、使用final關(guān)鍵字修飾一個(gè)變量時(shí),是引用不能變,還是引用的對(duì)象不能變?
使用final關(guān)鍵字修飾一個(gè)變量時(shí),是指引用變量不能變,引用變量所指向的對(duì)象中的內(nèi)容還是可以改變的。
11、"=="和equals方法究竟有什么區(qū)別?
==操作符專門用來比較兩個(gè)變量的值是否相等,也就是用于比較變量所對(duì)應(yīng)的內(nèi)存中所存儲(chǔ)的數(shù)值是否相同,要比較兩個(gè)基本類型的數(shù)據(jù)或兩個(gè)引用變量是否相等,只能用==操作符。
如果一個(gè)變量指向的數(shù)據(jù)是對(duì)象類型的,那么,這時(shí)候涉及了兩塊內(nèi)存,對(duì)象本身占用一塊內(nèi)存(堆內(nèi)存),變量也占用一塊內(nèi)存,例如Objet obj = newObject();變量obj是一個(gè)內(nèi)存,new Object()是另一個(gè)內(nèi)存,此時(shí),變量obj所對(duì)應(yīng)的內(nèi)存中存儲(chǔ)的數(shù)值就是對(duì)象占用的那塊內(nèi)存的首地址。對(duì)于指向?qū)ο箢愋偷淖兞浚绻容^兩個(gè)變量是否指向同一個(gè)對(duì)象,
即要看這兩個(gè)變量所對(duì)應(yīng)的內(nèi)存中的數(shù)值是否相等,這時(shí)候就需要用==操作符進(jìn)行比較。
equals方法是用于比較兩個(gè)獨(dú)立對(duì)象的內(nèi)容是否相同,就好比去比較兩個(gè)人的長(zhǎng)相是否相同,它比較的兩個(gè)對(duì)象是獨(dú)立的。例如,對(duì)于下面的代碼:
String a=new String("foo");
String b=new String("foo");
兩條new語句創(chuàng)建了兩個(gè)對(duì)象,然后用a/b這兩個(gè)變量分別指向了其中一個(gè)對(duì)象,這是兩個(gè)不同的對(duì)象,它們的首地址是不同的,即a和b中存儲(chǔ)的數(shù)值是不相同的,所以,表達(dá)式a==b將返回false,而這兩個(gè)對(duì)象中的內(nèi)容是相同的,所以,表達(dá)式a.equals(b)將返回true。
12、靜態(tài)變量和實(shí)例變量的區(qū)別?
在語法定義上的區(qū)別:靜態(tài)變量前要加static關(guān)鍵字,而實(shí)例變量前則不加。
在程序運(yùn)行時(shí)的區(qū)別:實(shí)例變量屬于某個(gè)對(duì)象的屬性,必須創(chuàng)建了實(shí)例對(duì)象,其中的實(shí)例變量才會(huì)被分配空間,才能使用這個(gè)實(shí)例變量。靜態(tài)變量不屬于某個(gè)實(shí)例對(duì)象,而是屬于類,所以也稱為類變量,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實(shí)例對(duì)象,靜態(tài)變量就會(huì)被分配空間,靜態(tài)變量就可以被使用了。
總之,實(shí)例變量必須創(chuàng)建對(duì)象后才可以通過這個(gè)對(duì)象來使用,靜態(tài)變量則可以直接使用類名來引用。
13、是否可以從一個(gè)static方法內(nèi)部發(fā)出對(duì)非static方法的調(diào)用?
不可以。因?yàn)榉莝tatic方法是要與對(duì)象關(guān)聯(lián)在一起的,必須創(chuàng)建一個(gè)對(duì)象后,才可以在該對(duì)象上進(jìn)行方法調(diào)用,而static方法調(diào)用時(shí)不需要?jiǎng)?chuàng)建對(duì)象,可以直接調(diào)用。也就是說,當(dāng)一個(gè)static方法被調(diào)用時(shí),可能還沒有創(chuàng)建任何實(shí)例對(duì)象,如果從一個(gè)static方法中發(fā)出對(duì)非static方法的調(diào)用,那個(gè)非static方法是關(guān)聯(lián)到哪個(gè)對(duì)象上的呢?這個(gè)邏輯無法成立,所以,一個(gè)static方法內(nèi)部發(fā)出對(duì)非static方法的調(diào)用。
14、Integer與int的區(qū)別
int是java提供的8種原始數(shù)據(jù)類型之一。Java為每個(gè)原始類型提供了封裝類,Integer是java為int提供的封裝類。int的默認(rèn)值為0,而Integer的默認(rèn)值為null,即Integer可以區(qū)分出未賦值和值為0的區(qū)別,int則無法表達(dá)出未賦值的情況。例如,要想表達(dá)出沒有參加考試和考試成績(jī)?yōu)?的區(qū)別,則只能使用Integer。
在JSP開發(fā)中,Integer的默認(rèn)為null,所以用el表達(dá)式在文本框中顯示時(shí),值為空白字符串,而int默認(rèn)的默認(rèn)值為0,所以用el表達(dá)式在文本框中顯示時(shí),結(jié)果為0,所以,int不適合作為web層的表單數(shù)據(jù)的類型。
在Hibernate中,如果將OID定義為Integer類型,那么Hibernate就可以根據(jù)其值是否為null而判斷一個(gè)對(duì)象是否是臨時(shí)的,如果將OID定義為了int類型,還需要在hbm映射文件中設(shè)置其unsaved-value屬性為0。
另外,Integer提供了多個(gè)與整數(shù)相關(guān)的操作方法,例如,將一個(gè)字符串轉(zhuǎn)換成整數(shù),Integer中還定義了表示整數(shù)的最大值和最小值的常量。
15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math類中提供了三個(gè)與取整有關(guān)的方法:ceil、floor、round,這些方法的作用與它們的英文名稱的含義相對(duì)應(yīng),例如,ceil的英文意義是天花板,該方法就表示向上取整,Math.ceil(11.3)的結(jié)果為12,Math.ceil(-11.3)的結(jié)果是-11;floor的英文意義是地板,該方法就表示向下取整,Math.ceil(11.6)的結(jié)果為11,Math.ceil(-11.6)的結(jié)果是-12;最難掌握的是round方法,它表示“四舍五入”,算法為Math.floor(x+0.5),即將原來的數(shù)字加上0.5后再向下取整,所以,Math.round(11.5)的結(jié)果為12,Math.round(-11.5)的結(jié)果為-11。
看過“javaee面試題”的人還看了:
1.阿里java面試題2016