當前位置:
首頁 > 知識 > 一大波面試題來襲,只待你來破解!

一大波面試題來襲,只待你來破解!

加強記憶。(長預警。。。覺得還有用就點個贊咯!

)

1.有關類方法的描述():

在類方法中可用this來調用本類的類方法 F

在類方法中調用本類的類方法時可直接調用 T

在類方法中只能調用本類中的類方法 F

在類方法中絕對不能調用實例方法 F

類方法是指static修飾的方法,屬於類本身,不可以使用this來引用,this指的是當前正在使用的這個對象;在類方法中可以使用其它類的類方法,使用類名.靜態方法名即可;想在類方法中調用實例方法需要在類方法中先實例化一個對象,才可以調用。

2.下列說法正確的有():

環境變數可在編譯source code時指定 T

在編譯程序時,所能指定的環境變數不包括class path F

javac一次可同時編譯數個Java源文件 T

javac.exe能指定編譯結果要置於哪個目錄(directory)T

a選項-d即可設置系統屬性;c選項一次編譯多個java文件用javac *.java. 即可編譯當前目錄下的所有java文件;d選項-s指定存放生成的源文件的位置;在編譯java文件的時候必須指定類的路徑。

3.下列程序的結果是:

public class Test{ public static void changeStr(String str) { str = "welcome"; } public static void main(String[] args) { String str = "1234"; changeStr(str); System.out.println(str); } }``` 輸出的結果是str值為1234. 字元串在編譯過程中,1234和welcome都被編譯到了方法區常量池中,在調用changeStr(str)的過程中,首先將str的引用傳遞給了changeStr(保存在在棧里,對str的引用進行了一次複製,二者都指向"1234"),然後在這裡面更改str的值,相當於在棧中將傳遞給changeStr的引用的值變化了,但是當changeStr結束之後,棧就清空了,因此原來的引用並沒有發生變化。這是JAVA值傳遞的特點決定的,並沒有引用傳遞。 4.能被java.exe成功運行的java class文件必須有main()方法 T 不包含main方法的JAVA程序可以被編譯,但是要想使用java.exe直接執行一個java位元組碼文件,該類必須有一個main方法,即程序的入口。否則會發生: ```java $java Hello 錯誤: 在類 Hello 中找不到 main 方法, 請將 main 方法定義為: public static void main(String[] args) 否則 JavaFX 應用程序類必須擴展javafx.application.Application

5.假定str0,...,str4後序代碼都是只讀引用。Java 7中,以上述代碼為基礎,在發生過一次FullGC後,上述代碼在Heap空間(不包括PermGen)保留的字元數為()

static String str0="0{}"; static String str1="0{}"; String str2=str1.substring(5); String str3=new String(str2); String str4=new String(str3.toCharArray()); str0=null;

保留的字元書為15,『0{}』為字元串常量,保存在方法區常量池中,屬於持久代對象(PermGen)。其它的像substring實際是new,5字元str3和4也都是new,每個5字元,分別都會創建新的對象,總共15個字元。(存疑?)

6.關於JAVA的垃圾回收機制,下面哪些結論是正確?

程序可以任意指定釋放內存的時間 F

JAVA程序不能依賴於垃圾回收的時間或者順序 T

程序可明確地標識某個局部變數的引用不再被使用 F

程序可以顯式地立即釋放對象佔有的內存 F

java提供了一個系統級的線程,即垃圾回收器線程。用來對每一個分配出去的內存空間進行跟蹤。當JVM空閑時,自動回收每塊可能被回收的內存,GC是完全自動的,不能被強制執行。程序員最多只能用System.gc()來建議執行垃圾回收器回收內存,但是具體的回收時間,是不可知的。對於局部變數可以直接讓其引用指向null,其實局部變數被保存在棧中,隨著方法的結束就會自動被回收。

7.下面程序執行的結果:

public class Test { public static void main(String[] args) { int x = 0; int y = 0; int k = 0; for (int z = 0; z 2) && (++y > 2) && (k++ > 2)) { x++; ++y; k++; } } //每一次循環xyk的值依次為 100->200->310->420->531,if判斷塊內的內容並沒執行 System.out.println(x + 」」 +y + 」」 +k);//結果為531 } }

這裡涉及到&&符號的短路作用,以及自增的特點。

8.Math.cos為計算弧度的餘弦值,Math.toRadians函數講角度轉換為弧度。

9.suspend() 和 resume() 方法:兩個方法配套使用,suspend()使得線程進入阻塞狀態,並且不會自動恢復,必須其對應的 resume() 被調用,才能使得線程重新進入可執行狀態。

10.判斷對錯。在java的多態調用中,new的是哪一個類就是調用的哪個類的方法。 F

java多態有兩種情況:重載和覆寫。在覆寫中,運用的是動態單分配,是根據new的類型確定對象,從而確定調用的方法,而且當調用子類中包含而父類並不存在的方法時,就不能多態引用子類對象

Foo f = new Sub();

,對於父子類中都有的方法和域,上面的多態引用,引用方法則是引用子類的方法,而引用域則引用父類的域;在重載中,運用的是靜態多分派,即根據靜態類型確定對象,因此不是根據new的類型確定調用的方法。

11.What is displayed when the following is executed:

double d1=-0.5; System.out.println("Ceil d1="+Math.ceil(d1)); System.out.println("floor d1="+Math.floor(d1)); //Ceil d1=0.0 //floor d1=-1.0

ceil方法,大於等於參數,並且與它最接近的整數。注釋:

If the argument value is less than zero but greater than -1.0, then the result is negative zero

如果參數小於0且大於-1.0,結果為-0。ceil和floor方法(小於等於參數,且與之最接近的整數。)都有注釋:

If the argument is NaN or an infinity or positive zero or negative zero, then the result is the same as the argument

意思為:如果參數是NaN、無窮、正0、負0,那麼結果與參數相同,如果是-0.0,那麼其結果是-0.0。

12.下面的輸出結果是什麼?

public class Demo { public static void main(String args[]) { { String str=new String("hello"); if(str=="hello") { System.out.println("true"); } else { System.out.println("false"); } } } //false

用雙等號來判斷兩個變數是否相等時,如果兩個變數是基本類型變數,且都是數值類型(不要求數據類型嚴格相同),則只要兩個變數的值相等,就返回true;對於兩個引用類型變數,必須指向同一個對象,雙等號才會返回true。

java中使用new String("hello")時,jvm會先使用常量池來貯存"hello"常量,再調用String類的構造器創建一個新的String對象,新創建的對象被保存在堆內存中;str變數指向保存在堆中的這個「hello」對象,而不是直接直接指向常量池中的「hello」,故二者不相等。

13.忽略內部介面的情況,能夠修飾介面的只有public和abstract,即使不寫修飾符,也不是默認修飾符,而是public。

14.以下代碼將列印出:

public static void main (String[] args) { String classFile = "com.jd.". replaceA11(".", "/") + "MyClass.class"; System.out.println(classFile); } //com/jd/MyClass.class

由於replaceAll方法的第一個參數是一個正則表達式,而"."在正則表達式中表示任何字元,所以會把前面字元串的所有字元都替換成"/"。如果想替換的只是".",那麼久要寫成"[.]"。

15.在Jdk1.7中,下述說法中抽象類與介面的區別正確的有哪些?

a.抽象類中可以有普通成員變數,介面中沒有普通成員變數。 T

b.抽象類和介面中都可以包含靜態成員常量。 T

c.一個類可以實現多個介面,但只能繼承一個抽象類 T

d.抽象類中可以包含非抽象的普通方法,介面中的方法必須是抽象的,不能有非抽象的普通方法。 T

介面(interface)可以說成是抽象類的一種特例,介面中的所有方法都必須是抽象的。介面中的方法定義默認為public abstract類型,介面中的成員變數類型默認為public static final。另外,介面和抽象類在方法上有區別:

抽象類可以有構造方法,介面中不能有構造方法。

抽象類中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。

抽象類中可以有普通成員變數,介面中沒有普通成員變數。

抽象類中的抽象方法的訪問類型可以是public,protected和默認類型。

抽象類中可以包含靜態方法,介面中不能包含靜態方法。

抽象類和介面中都可以包含靜態成員變數,抽象類中的靜態成員變數的訪問類型可以任意,但介面中定義的變數只能是public static final類型,並且默認即為public static final類型。

一個類可以實現多個介面,但只能繼承一個抽象類。二者在應用方面也有一定的區別:介面更多的是在系統架構設計方法發介面更多的是在系統架構設計方法發揮作用揮作用,主要用於定義模塊之間的通信契約。而抽象類在代碼實現方面發揮作用,可以實現代碼的重用,

java8中在介面中可以有實現了的默認方法,用default修飾。

16.list是一個ArrayList的對象,哪個選項的代碼填到//todo delete處,可以在Iterator遍歷的過程中正確並安全的刪除一個list中保存的對象?

Iterator it = list.iterator(); int index = 0; while (it.hasNext()) { Object obj = it.next(); if (needDelete(obj)) //needDelete返回boolean,決定是否要刪除 { //todo delete } index ++; }

a.it.remove(); T

b.list.remove(obj);

c.list.remove(index);

d.list.remove(obj,index);

Iterator支持從源集合中安全地刪除對象,只需在 Iterator 上調用 remove() 即可。這樣做的好處是可以避免 ConcurrentModifiedException(如循環過程中list.size()的大小變化了,就導致了錯誤。) ,當打開 Iterator 迭代集合時,同時又在對集合進行修改。有些集合不允許在迭代時刪除或添加元素,但是調用 Iterator 的remove() 方法是個安全的做法。

17.問這個程序的輸出結果。

a.Base SonB

b.Son SonB

c.Base Son SonB

d.編譯不通過 T

由於使用父類的引用來引用子類的對象,而Son含有Base不包含的方法methodB(),所以此時就不能使用父類來引用子類方法。可能有些說我在運行的時候動態綁定到子類的methodB()方法不就好了,這是編譯器層面進行的,沒有動態綁定,在編譯時就無法通過。

18.Java程序的種類有( )

a.類(Class)

b.Applet T

c.Application T

d.Servlet T

Java程序的種類有:

內嵌於Web文件中,由瀏覽器來觀看的 Applet

可獨立運行的 Application

伺服器端的 Servlets

19.如下Java語句

double x= 3.0; int y=5; x/=--y;

執行後, x的值是()

你們猜是幾?(答案在最後,我不信都會,哈哈。)

20.下面代碼的輸出是什麼?

public class Base { private String baseName = "base"; public Base() { callName(); } public void callName() { System. out. println(baseName); } static class Sub extends Base { private String baseName = "sub"; public void callName() { System. out. println (baseName) ; } } public static void main(String[] args) { Base b = new Sub(); } //null }

最後是有關對象創建以及代碼執行順序的題目,作為壓軸菜。

new Sub();在創造派生類的過程中首先創建基類對象,然後才能創建派生類。創建基類即默認調用Base()方法,在方法中調用callName()方法,由於派生類中存在此方法,則被調用的callName()方法是派生類中的方法,此時派生類還未構造,所以變數baseName的值為null。

讓我們來回憶一下對象創建的步驟,當執行new操作時,先執行父類的靜態代碼塊,然後子類靜態代碼塊,然後父類構造器,然後子類構造器。這裡還涉及到運行時動態綁定,即父類引用子類對象。


慢慢消化吧 未完待續。。。

哦,答案是0.75


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 java吧 的精彩文章:

「奔三」了,程序員,你該怎麼選擇未來的路?

TAG:java吧 |