1、請給出最終輸出內容,
nt i = 3;
String result = new String();
switch (i) {
case 1:
result = result + "him ";
case 2:
result = result + "her ";
case 3:
result = result + "it ";
default:
result = result + "me ";
}
System.out.println(result);
it me
him her it me
him her
me
沒有break;會向下穿透,執行default;如果有break就會跳出,不執行以下程式;屬于分支結構的一種,先判斷條件,再選擇執行代碼塊
A
2、對于java型別變數char c,short s,float f,double d,運算式c*s+f+d的結果型別為()
float
char
short
double
自動型別轉換遵循下面的規則:
1.若參與運算的資料型別不同,則先轉換成同一型別,然后進行運算,
2.轉換按資料長度增加的方向進行,以保證精度不降低,例如int型和long型運算時,先把int量轉成long型后再進行運算,
3.所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的運算式,也要先轉換成double型,再作運算,
4.char型和short型參與運算時,必須先轉換成int型,
5.在賦值運算中,賦值號兩邊的資料型別不同時,需要把右邊運算式的型別將轉換為左邊變數的型別,如果右邊運算式的資料型別長度比左邊長時,將丟失一部分資料,這樣會降低精度,
下圖表示了型別自動轉換的規則:
D
3、以下哪個方法用于定義執行緒的執行體?
start()
init()
run()
synchronized()
run()相當于執行緒的任務處理邏輯的入口方法,它由Java虛擬機在運行相應執行緒時直接呼叫,而不是由應用代碼進行呼叫,
而start()的作用是啟動相應的執行緒,啟動一個執行緒實際是請求Java虛擬機運行相應的執行緒,而這個執行緒何時能夠運行是由執行緒調度器決定的,start()呼叫結束并不表示相應執行緒已經開始運行,這個執行緒可能稍后運行,也可能永遠也不會運行,
run方法執行緒執行體.start方法開啟多執行緒
C
4、一個檔案中的資料要在控制臺上顯示,首先需要( ),
System.out.print (buffer[i]);
FileOutputStream fout = new FileOutputStream(this.filename);
FileInputStream fin = new FileInputStream(this.filename);,
System.in.read(buffer)
一個檔案中的資料要在控制臺顯示,首先需要獲取檔案中的內容,使用FileInputStream fin = new FileInputStream(this.filename);
C
5、下面哪個關鍵字可以用于Java的構造方法上?
final
static
synchronized
native
None of these.
構造方法不能被子類繼承,所以用final修飾沒有意義,構造方法用于創建一個新的物件,不能作為類的靜態方法,所以用static修飾沒有意義,此外,Java語言不支持native或synchronized的構造方法,
1 構造方法可以被多載,一個構造方法可以通過this關鍵字呼叫另一個構造方法,this陳述句必須位于構造方法的第一行;
多載:方法的多載(overload):多載構成的條件:方法的名稱相同,但引數型別或引數個數不同,才能構成方法的多載,2 當一個類中沒有定義任何構造方法,Java將自動提供一個預設構造方法;
3 子類通過super關鍵字呼叫父類的一個構造方法;
4 當子類的某個構造方法沒有通過super關鍵字呼叫父類的構造方法,通過這個構造方法創建子類物件時,會自動先呼叫父類的預設構造方法
5 構造方法不能被static、final、synchronized、abstract、native修飾,但可以被public、private、protected修飾;
6 構造方法不是類的成員方法;
7 構造方法不能被繼承,E
6、指出下來程式運行的結果是

good and abc
good and gbc
tst ok and abc
tst ok and gbc
實參和形參的問題,"ex.change(ex.str, ex.ch)"陳述句呼叫"change"方法時,將ex.str變數(實參)的值賦給了"change"方法中的str變數(形參),而將ex.ch(實參)的地址賦給了"change"方法中的ch(形參),"change"方法運行時,第一條陳述句改變的是方法中形參的值,對實參沒影響,第二條陳述句由于是直接改變的ch所指地址的值,所以把實參也進行了改變,
由于堆疊幀1的ex區域變數指向的物件內的成員str指向的物件沒有任何變化,因此
System.out.println(ex.str+"and"); 依然列印結果為:good and
而成員ch指向的物件內容有所變化,因此
System.out.println(ex.ch);列印結果為:gbc
B
7、在JAVA中,假設A有構造方法A(int a),則在類A的其他構造方法中呼叫該構造方法和陳述句格式應該為()
this.A(x)
this(x)
super(x)
A(x)
this的作用其中一個就是在一個構造方法中呼叫另一個構造方法,格式為this(引數);
super是呼叫父類的方法;
A(a)這種形式是在new一個類時使用
B
8、閱讀如下代碼, 請問,對陳述句行 test.hello(). 描述正確的有()
package NowCoder;
class Test {
public static void hello() {
System.out.println("hello");
}
}
public class MyApplication {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test test=null;
test.hello();
}
}
能編譯通過,并正確運行
因為使用了未初始化的變數,所以不能編譯通過
以錯誤的方式訪問了靜態方法
能編譯通過,但因變數為null,不能正常運行
因為Test類的hello方法是靜態的,所以是屬于類的,當實體化該類的時候,靜態會被優先加載而且只加載一次,所以不受實體化new Test();影響,只要是使用到了Test類,都會加載靜態hello方法
在其他類的靜態方法中也是可以呼叫公開的靜態方法,此題hello方法是使用public修飾的所以在MyApplication中呼叫hello也是可以的,
即使Test test=null;這里也會加載靜態方法,所以test資料中包含Test類的初始化資料,(靜態的,構造的,成員屬性)因此test.hello是會呼叫到hello方法的
A
9,下面有關java classloader說法正確的是()?
ClassLoader就是用來動態加載class檔案到記憶體當中用的
JVM在判定兩個class是否相同時,只用判斷類名相同即可,和類加載器無關
ClassLoader使用的是雙親委托模型來搜索類的
Java默認提供的三個ClassLoader是Boostrap ClassLoader,Extension ClassLoader,App ClassLoader
JDK中提供了三個ClassLoader,根據層級從高到低為:
- Bootstrap ClassLoader,主要加載JVM自身作業需要的類,
- Extension ClassLoader,主要加載%JAVA_HOME%\lib\ext目錄下的庫類,
- Application ClassLoader,主要加載Classpath指定的庫類,一般情況下這是程式中的默認類加載器一般情況下這是程式中的默認類加載器,也是ClassLoader.getSystemClassLoader() 的回傳值,
JVM加載類的實作方式,我們稱為 雙親委托模型
如果一個類加載器收到了類加載的請求,他首先不會自己去嘗試加載這個類,而是把這個請求委托給自己的父加載器,每一層的類加載器都是如此,因此所有的類加載請求最終都應該傳送到頂層的Bootstrap ClassLoader中,只有當父加載器反饋自己無法完成加載請求時,子加載器才會嘗試自己加載,
雙親委托模型的重要用途是為了解決類載入程序中的安全性問題,
假設有一個開發者自己撰寫了一個名為Java.lang.Object的類,想借此欺騙JVM,現在他要使用自定義ClassLoader來加載自己撰寫的java.lang.Object類,然而幸運的是,雙親委托模型不會讓他成功,因為JVM會優先在Bootstrap ClassLoader的路徑下找到java.lang.Object類,并載入它
ACD
10、tring s=null;下面哪個代碼片段可能會拋出NullPointerException?
if((s!=null)&(s.length()>0))
if((s!=null)&&(s.length()>0))
if((s==null)|(s.length()==0))
if((s==null)||(s.length()==0))
s為null,因此只要呼叫了s.length()都會拋出空指標例外,因此這個題目就是考察if陳述句的后半部分會不會執行,
A,單個與操作的符號& 用在整數上是按位與,用在布爾型變數上跟&&功能類似,但是區別是無論前面是否為真,后面必定執行,因此拋出例外
B,與操作,前半部分判斷為假,后面不再執行
C,這里跟 & 和&& 的區別類似,后面必定執行,因此拋出例外
D,或陳述句,前面為真,整個結果必定為真,后面不執行AC
11、關于OutOfMemoryError,下面說法正確的是()?
java.lang.OutOfMemoryError: PermGen space 增加-XX:MaxPermSize這個引數的值的話,這個問題通常會得到解決,
java.lang.OutOfMemoryError: Requested array size exceeds VM limit當你正準備創建一個超過虛擬機允許的大小的陣列時,這條錯誤將會出現
java.lang.OutOfMemoryError: Java heap space 一般情況下解決這個問題最快的方法就是通過-Xmx引數來增加堆的大小
java.lang.OutOfMemoryError: nativeGetNewTLA這個例外只有在jRockit虛擬機時才會碰到
關于此題,《深入理解java虛擬機》有關于OOM(OutOfMemory)問題的解釋
A:屬于運行時常量池導致的溢位,設定-XX:MaxPermSize可以解決這個問題,
B:屬于堆空間不足導致的錯誤,問題比較少見,解決方式和C相同,
C:屬于java堆記憶體問題,一般的手段是通過記憶體映像分析工具,對Dump出來的堆轉儲存快照進行分析,重點是確認記憶體中的物件是否是有必要的,也就是要判斷是出現了記憶體泄漏,還是出現了記憶體溢位,如果是記憶體列樓,通過工具檢查泄露物件打GC Roots的參考鏈資訊,可以準確的確定出泄露代碼的位置,不存在泄露,就應該檢查虛擬機的堆引數,如果可以繼續調大,可以設定-Xmx解決問題
D:java.lang.OutOfMemoryError: nativeGetNewTLA指當虛擬機不能分配新的執行緒本地空間(Thread Local Area)的時候錯誤資訊,此錯誤是執行緒申請一個新的TLA時產生的,這個例外一般只會發生在jRockit虛擬機,只有過于絕對,
ABC
12、針對以下代碼,哪些選項執行后是true的:()
class CompareReference{
public static void main(String [] args){
float f=42.0f;
float f1[]=new float[2];
float f2[]=new float[2];
float[] f3=f1;
long x=42;
f1[0]=42.0f;
}
}
f1==f2
x==f1[0]
f1==f3
f2==f1[1]
如果兩個運算元其中有一個是double型別,另一個操作就會轉換為double型別,否則,如果其中一個運算元是float型別,另一個將會轉換為float型別,否則,如果其中一個運算元是long型別,另一個會轉換為long型別,否則,兩個運算元都轉換為int型別,故,x==f1[0]中,x將會轉換為float型別,基本型別之間的比較,應該會將低精度型別自動轉為高精度型別再比較,
byte , short , int , long , fload , double
作比較的時候會自動向上轉型, 向下轉型的時候則需要強轉
BC
13、關于equals和hashCode描述正確的是 ()
兩個obj,如果equals()相等,hashCode()一定相等(符合代碼規范的情況下)
兩個obj,如果hashCode()相等,equals()不一定相等
兩個不同的obj, hashCode()可能相等
其他都不對
“==”:作用是判斷兩個物件的地址是否相等,即,判斷兩個物件是不是同一個物件,如果是基本資料型別,則比較的是值是否相等,
"equal":作用是判斷兩個物件是否相等,但一般有兩種使用情況
1.類沒有覆寫equals()方法,則相當于通過“==”比較
2.類覆寫equals()方法,一般,我們都通過equals()方法來比較兩個物件的內容是否相等,相等則回傳true,如String
hashCode()的存在是為了查找的快捷性,用于在散列存盤結構中確定物件的存盤地址
如果兩個物件 equals相等,則 hashCode()也一定相等
如果 equals方法被重寫,則 hashCode()也應該被重寫
如果兩個物件的 hashCode()相等, equals()方法不一定相等
equals方法沒有重寫,比較的就是應用型別的變數所指向的物件的地址
ABC
14、下面關于面向物件的一些理解哪些是錯誤的( )
面向物件的最重要的特性是支持繼承、封裝和多型
系統設計應該遵循開閉原則,系統應該穩定不不可修改,但應支持通過繼承、組合等方式進行擴展
函式式的語言必然是面向物件的語言
面向物件設計時,每個類的職責應該單一,不要再一個類中引入過多的介面
程序式語言和面向物件的語言各有其優勢,程序式語言更加靈活,面向物件語言更加強調抽象和封裝
Java和C++都是靜態型別的面向物件編程語言
典型的函式式語言haskell
C
15、下面正確的2項是?
public class NameList
{
private List names = new ArrayList();
public synchronized void add(String name)
{
names.add(name);
}
public synchronized void printAll() {
for (int i = 0; i < names.size(); i++)
{
System.out.print(names.get(i) + "");
}
}
public static void main(String[]args)
{
final NameList sl = new NameList();
for (int i = 0; i < 2; i++)
{
new Thread()
{
public void run()
{
sl.add("A");
sl.add("B");
sl.add("C");
sl.printAll();
}
} .start();
}
}
}
運行的時候可能拋例外
運行的時候可能沒有輸出,也沒有正常退出
代碼運行的時候可能沒有輸出,但是正常退出
代碼輸出"A B A B C C "
代碼輸出"A B C A B C A B C "
代碼輸出"A A A B C A B C C "
代碼輸出"A B C A A B C A B C "
在每個執行緒中都是順序執行的,所以sl.printAll();必須在前三句執行之后執行,也就是輸出的內容必有(連續或非連續的)ABC,
而執行緒之間是穿插執行的,所以一個執行緒執行 sl.printAll();之前可能有另一個執行緒執行了前三句的前幾句,
E答案相當于執行緒1順序執行完然后執行緒2順序執行完,
G答案則是執行緒1執行完前三句add之后執行緒2插一腳執行了一句add然后執行緒1再執行 sl.printAll();輸出ABCA,接著執行緒2順序執行完輸出ABCABC
輸出加起來即為ABCAABCABC,
EG
16、有關執行緒的敘述正確的是()
可以獲得對任何物件的互斥鎖定
通過繼承Thread類或實作Runnable介面,可以獲得對類中方法的互斥鎖定
執行緒通過使用synchronized關鍵字可獲得物件的互斥鎖定
執行緒調度演算法是平臺獨立的
執行緒的互斥鎖機制:synchronized,lock,condition
執行緒調度分為協同式調度和搶占式調度,Java使用的是搶占式調度,也就是每個執行緒將由作業系統來分配執行時間,執行緒的切換不由執行緒本身來決定(協同式調度),
CD
17、下面哪些類可以被繼承? Java.lang.Thread、java.lang.Number、java.lang.Double、java.lang.Math、 java.lang.ClassLoader
Thread
Number
Double
Math
ClassLoader
A,Thread可以被繼承,用于創建新的執行緒
B,Number類可以被繼承,Integer,Float,Double等都繼承自Number類
C,Double類的宣告為
public final class Doubleextends Numberimplements Comparable<Double>final生明的類不能被繼承
D,Math類的宣告為
public final class Mathextends Object不能被繼承
E,ClassLoader可以被繼承,用戶可以自定義類加載器
ABE
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/401519.html
標籤:其他





