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