Java基礎語法面試題50題整理(帶答案)


嗯,之前某些原因整理了這份面試題,加油生活 (:
 
0,嗯,先做簡單的,那個不對()
1,int [] sy = {0,9,2,3};
2,int [] sy1 = new int[4];
3,int[][]l = new int[][3];
4,int [][] lr = new int[3][];
 
1、一個".java"源文件中是否可以包括多個類(不是內部類)?有什么限制?
 
2、Java 有沒有 goto?
 
3、說說&和&&的區別。
 
4、在 JAVA 中如何跳出當前的多重嵌套循環?
 
5、什么是裝箱和拆箱,jdk1.5 前用什么方法實現基本類型的裝箱和拆箱?
 
6、switch 語句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?
 
7、char 型變量中能不能存貯一個中文漢字?為什么?
 
8,基本類型和引用類型數組的默認初始值都是多少啦?
 
9、用最有效率的方法算出 2 乘以 8 等於幾?或者 2<<3 等於幾
 
10,基本類型與 String 類型如何轉換?
 
11、"=="和 equals 方法究竟有什么區別?
 
12、使用 final 關鍵字修飾一個變量時,是引用不能變,還是引用的對象不能變?
 
13、是否可以從一個 static 方法內部發出對非 static 方法的調用?
 
14,這個代碼輸出啥?
public static void main(String[] args) {
Integer integer = 128;
Integer integer1 = 128;
Integer integer2 = -128;
Integer integer3 = -128;
System.out.println(integer==integer1);
System.out.println(integer2==integer3);
}
 
15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
 
16,構造器 Constructor 是否可被 override?
 
17、接口是否可繼承接口?抽象類是否可實現(implements)接口?抽象類是否可 繼承具體類(concrete class)?抽象類中是
 
否可以有靜態的 main 方法?
 
18、Overload 和 Override 的區別。Overloaded 的方法是否可以改變返回值 的類型?
 
19,String ,StringBuffer , StringBuilder :的區別即使用場景?
 
20,這個輸出啥?
int x= 4;
System.out.println("values:"+((x > 4)?10.8:10));
 
21、 運算符優先級別排序正確的是()
A、 由高向低分別是:()、!、算術運算符、關系運算符、邏輯運算符、賦值運算符;
B、 由高向低分別是:()、關系運算符、算術運算符、賦值運算符、!、邏輯運算符;
C、 由高向低分別是:()、算術運算符、邏輯運算符、關系運算符、!、賦值運算符;
D、 由高向低分別是:()、!、關系運算符、賦值運算符、算術運算符、邏輯運算符;
 
 
22,;這幾行代碼執行后,輸出啥?
String string = "我喜歡";
String string1 = "我喜歡";System.out.println(string==string1);
String string2 = new String("我喜歡");
System.out.println(string==string2);
String string3 = string +"兔兔";
System.out.println(string3==string);
 
 
23、 下列代碼輸出結果是()
int i = 10;
while ( i > 0 ){
i = i + 1;
if ( i = =10 ){
break;
}}
A. while 循環執行 10 次
B. 死循環
C. 循環一次都不執行
D. 循環執行一次
 
24、 以下()代碼,能夠對數組正確初始化(或者是默認初始化)。
A、 String[] strings = new String[]{"sy","lrl"};
B、 a = {1, 2, 3, 4, 5};
C、 int[] a = new int[5]{1, 2, 3, 4, 5};
D、 int[] a = new int[5];
 

25.Java 中是否可以重寫(override)一個 private 或者是static 的方法?

 

26、什么是內部類?Static Nested Class 和 Inner Class 的不同是啥?

 

27、JAVA 語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分 別代表什么意義?在 try塊中可以拋出異常嗎?異常有啥用了? 

 

28,java的異常機制有那三種,分別談談你的認識:

 

29,short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 +=1;有什么錯?

 

30,ArrayList 與 LinkedList 區別 ?

 

31.Vetor arraylist Linkedlist 區別 ?

 

32,Collection 和 Collections 的區別?。

 

33、 HashMap 和 Hashtable 的區別。

 

34、 常見的 runtime exception 有哪些

 

35,數組(Array)和列表(ArrayList)有什么區別?什么時候應該使用 Array 而不是 ArrayList? 

 

36 Object類是一個特殊的類,是所有類的父類,有什么方法 ?

 

37,下面的程序代碼輸出的結果是多少?

public class Test {

    public static void main(String[] args) {
         System.out.println(new Test().test());
     }
     int test() {
         try {
             return func1();
         }finally{
             return func2();
         }
     }

     int func1() {
         System.out.println("func1");
         return 1;
     }

     int func2() {
         System.out.println("func2");
         return 2;
     }

 

 38,單例模式了解嗎?來給我手寫一下!寫一個線程安全的。

 

39,接口和抽象類的區別是什么 ?

 

40,java 中實現多態的機制是什么?

 

41,下列程序輸出啥?

public class Test {

    public static void main(String[] args) {
         System.out.println(new Test().test());
     }
    static int test()  {
        int x = 1;
        try {
            return x;
        }finally {
            ++x;
        }
    }
}

 

42,instanceof操作符是用來看啥的?有哪些應用場景?instanceof允許存在泛型參數嗎?

 

43,Java的泛型是類型擦除的是什么意思?

 

44,可以初始化泛型參數和數組嗎?

 

45,談談你對泛型中泛型通配符即extends和super 的認識?

 

46.集合庫框架的繼承關系?

 

47,那你知不知道this和super為啥不能寫在靜態方法中呢?

 

String string = new String("string");
String strings = "string";

48,這兩行代碼創建了幾個對象

 
 
答案:

03

1,可以有多個類,但只能有一個 public 的類,並且 public 的類名必須與文件名相一致。

2,java 中的保留字,現在沒有在 java 中使用。

3,&和&&都可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都 為 true 時,整個運算結果才為 true,否則,只要有一方為 false,則結果為 false。 &&還具有短路的功能,即如果第一個表達式為 false,則不再計算第二個表達式,

例如,對 if(str != null&& !str.equals(“”))表達式,當 str 為 null 時,后面的表達式不會執行,所以不 會出現 NullPointerException 如果將&&改為&,則會拋出 NullPointerException 異常。 If(x==33 &++y>0) y 會增長,If(x==33 && ++y>0)不會增長 &還可以用作位運算符,當&操作符兩邊的表達式不是 boolean 類型時,&表示按位與操作,

4,兩種方法,標簽加break ,外層的循環條件表達式的結果可以受到里 層循環體代碼的控制

  

 方法一  

 ok:for (int i = 0; i < 10; i++){
            for (int j = 0; j < 10; j++){
            if (j == 3) break ok;
        }
    }

方法二
boolean boo = true;
for (int i = 0; i < 10&&boo; i++){
    for (int j = 0; j < 10; j++){
    if (j == 3) {
        boo=false;
        break ;
        }
    }
}

 

5,①裝箱:指將基本類型數據值轉換成對應的封裝對象,即將棧中的數據封裝成對象存放到堆棧中;

   ②拆箱:拆箱是裝箱的反過程,是封裝的對象轉換成基本類型的數據值,即將堆中的數據值存放到棧中的過程。

裝箱:Integer integer = Integer.valueOf(12);

拆箱:int i = integer.intValue();
//jdk1.5之后自動調用
Integer integer1 = 12;
int i1 = integer;

6,在 switch(expr1)中,jdk1.7以前,expr1只能是一個整數表達式或者枚舉常量(更大字體),整數表達 式可以是 int 基本類型或 Integer 包裝類型,由於,byte,short,char 都可以隱含轉換為 int,所以,這些類型以及這些類型的包裝類型也是可以的。顯然,long 和 String 類型都不符合 switch 的語法規定,並且不能被隱式轉換成 int 類型,所以,它們不能作用於 swtich 語句中。在jdk1.7后,整形,枚舉類型,boolean,字符串都可以。

7,char 型變量是用來存儲 Unicode 編碼的字符的,unicode 編碼字符集中包含了漢字,所以, char 型變量中當然可以存儲漢字啦。:unicode 編 碼占用兩個字節,所以,char 類型的變量也是占用兩個字節

8,數值型的初始值為0;布爾型的初始值為false;字符型的為‘\0’(字符串結束標識);引用類型的則為NULL(空引用)字符串String就屬於引用類型;

9,2 << 3, 因為將一個數左移 n 位,就相當於乘以了2的 n 次方,那么,一個數乘以8只要將其左移3位 即可,而位運算 cpu 直接支持的,效 率最高,所以,2乘以8等於幾的最效率的方法是2 << 3。

 

 

10,

將字符串的值轉換為基本類型的方法:

直接利用封裝類的構造方法,即Xxx(String s)例:int num1=new Integer("12");

調用封裝類提供的int num =Integer.paresXxx("123");

將基本類型的值轉換為字符串:

直接使用一個空字符串來連接數值即可,String as=" "+as;

調用封裝類提供的toString()靜態方法,String as=Integer.toString( 100);

調用String類提供的valueOf()靜態方法,String as=String.valueOf(45);

11,

==操作符專門用來比較兩個變量的值是否相等,也就是用於比較變量所對應的內存中所存 儲的數值是否相同,要比較兩個基本類型的數據或兩個引用變量是否相等,只能用==操作 符。

如果一個變量指向的數據是對象類型的,那么,這時候涉及了兩塊內存,對象本身占用一塊 內存(堆內存),變量名也占用一塊內存(java虛擬機棧),例如 Objet obj = new Object();變量 obj 是一個內存, new Object()是另一個內存,此時,變量 obj 所對應的內存中存儲的數值就是對象占用的那 塊內存的首地址。如果要比較兩個變量是否指向同一個對象,這時候就需要用==操作符進行比較。

equals 方法是用於比較兩個獨立對象的內容是否相同,就好比去比較兩個人的長相是否相 同,它比較的兩個對象是獨立的。例如,對於下面的代碼: String a=new String("foo"); String b=new String("foo"); 兩條 new 語句創建了兩個對象,然后用 a/b 這兩個變量分別指向了其中一個對象,這是兩 個不同的對象,它們的首地址是不同的,即 a 和 b 中存儲的數值是不相同的,所以,表達 式 a==b 將返回 false,而這兩個對象中的內容是相同的,所以,表達式 a.equals(b)將返回 true。

記住,字符串的比較基本上都 是使用 equals 方法。 如果一個類沒有自己定義 equals 方法,那么它將繼承 Object 類的 equals 方法,Object 類 的 equals 方法的實現代碼如下: boolean equals(Object o){ return this==o; } 這說明,如果一個類沒有自己定義 equals 方法,它默認的 equals 方法(從 Object類繼承 的)就是使用==操作符,也是在比較兩個變量指向的對象是否是同一對象,這時候使用 equals 和使用==會得到同樣的結果,如果比較的是兩個獨立的對象則總返回 false。

12

使用 final 關鍵字修飾一個變量時,是指引用變量不能變,引用變量所指向的對象中的內容 還是可以改變的。例如,對於如下語句:改變引用變量時報錯。

 

13

,不可以。因為非 static 方法是要與對象關聯在一起的,必須創建一個對象后,才可以在該對 象上進行方法調用,而 static 方法調用時不需要創建對象,可以直接調用。也就是說,當一 個 static 方法被調用時,可能還沒有創建任何實例對象,如果從一個 static 方法中發出對非 static 方法的調用,那個非 static 方法是關聯到哪個對象上的呢?這個邏輯無法成立,所以, 一個 static 方法內部發出對非 static 方法的調用。

14,

false

true

裝箱生成的對象,裝箱動作通過valueOf實現的,整型池容納-128—127之間的Integer對象,不在該范圍的int類型通過new生成包裝對象。即-128這個數字的包裝每次都是同一個對象,而128不是同一個對象。整形池存在不僅提高了系統性能,節約內存空間。

15,

Math 類中提供了三個與取整有關的方法:ceil、floor、round,這些方法的作用與它們的英 文名稱的含義相對應,例如,ceil 的英文意義是天花板,該方法就表示向上取整, Math.ceil(11.3)的結果為12,Math.ceil(-11.3)的結果是-11;floor 的英文意義是地板,該方法 就表示向下取整,Math.ceil(11.6)的結果為11,Math.ceil(-11.6)的結果是-12;最難掌握的是 round 方法,它表示“四舍五入”,算法為 Math.floor(x+0.5),即將原來的數字加上0.5后再向 下取整,所以,Math.round(11.5)的結果為12,Math.round(-11.5)的結果為-11。

16,

構造器 Constructor不能被繼承,因此不能重寫 Override ,但可以被重載 Overload 。

17

接口可以繼承接口。抽象類可以實現(implements)接口,抽象類可以繼承具體類。抽象類中 可以有靜態的 main 方法

 

 

18,

Overload 是重載的意思,Override 是覆蓋的意思,也就是重寫。

重載 Overload 表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相 同(即參數個數或類型,順序不同)

1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不 同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是 fun(int,float), 但是不能為 fun(int,int));

 2、不能通過訪問權限、返回類型、拋出的異常進行重載;

3、方法的異常類型和數目不會對重載造成影響;

4、對於繼承來說,如果某一方法在父類中是訪問權限是 priavte,那么就不能在子類對其進 行重載,如果定義的話,也只是定義了一個新方法,而不會達到重載的效果。

重寫 Override 表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子 類創建的實例對象調用這個方法時,將調用子類中的定義方法

1、覆蓋的方法的標志必須要和被覆蓋的方法的標志完全匹配,才能達到覆蓋的效果;

2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;

 3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;

4、被覆蓋的方法不能為 private,否則在其子類中只是新定義了一個方法,並沒有對其進行 覆蓋

19,

StirngStringBuffer,StringBulider都實現了charSequence接口,String為不可改變量,修改要么創建新的字符串對象,要么返回自己(str.substring(0)),StringBuffer是一個可變字符序列,他與String一樣,在內存中的都是一個有序的字符序列,不同點是值可以改變,StringBuilder 與 StringBuffer在性能上基本相同,都為可變字符序列。不同點為StringBuffer為線程安全的,而StringBuilder為線程不安全。

使用場景:String:常量的聲明,少量的變量運算。StringBuffer:頻繁的字符串運算,多線程(xml,Http解析)。StringBuilder:頻繁的字符串運算,單線程(SQL語句拼接)。

20,

10.0

21,A,  TT這道題我也不知為啥

22,true   false  false 

23,B

24,AD

25

 Java 中不能覆蓋private方法,因為private修飾的方法只能在當前類中使用,體現的是封裝性,其他子類不能訪問當前類的private方法,即也不能實現重寫。

 Java中靜態方法不能被覆蓋,方法的覆蓋是多態的一種,是基於運行時動態綁定的,而static方法是編譯時靜態綁定的。Static方法與類的實例沒有關系,不體現多態。所以不能實現覆蓋,重寫的static方法的行為被稱為隱藏。

26

內部類就是在一個類的內部定義的類,

java中的嵌套類(Nesetd Class):分為兩種,靜態內部類(也叫靜態嵌套類,Static Nested Class)和內部類(Inner Class),

靜態內部類

:加強了類的封裝性,提高了代碼的可讀性。靜態內部類不持有外部類的引用(普通內部類可以訪問外部類的方法,屬性,即使是private類型也可以訪問,靜態內部類只可以訪問外部類的靜態方法和靜態屬性),靜態內部類不依賴外部類(普通內部類與外部類之間是相互依賴的關系,) 靜態內部類可以獨立存在,即使外部類消亡,靜態內部類還是可以存在),

內部類:

不能定義靜態成員,內部類可以直接訪問外部類中的成員變量;內部類可以定義在外部類的方法外面, 也可以定義在外部類的方法體中

在方法體外面定義的內部類的訪問類型可以是 public,protecte,默認的,private 等4種類型, 這就好像類中定義的成員變量有4種訪問類型一樣

在方法內部定義的內部類前面不能有訪問類型修飾符,就好像方法中定義的局部變量一樣, 但這種內部類的前面可以使用 final 或 abstract修飾符。這種內部類對其他類是不可見的其 他類無法引用這種內部類

27

首先講處理異常的機制,Java將異常分為Error和Exception

Error一般是jvm'錯誤,不可挽回的錯誤,

excprtion 指程序中出現的異常

分為檢查型異常和非檢查型異常

檢查型異常是指程序必須要處理的異常

非檢查型異常是指可以發生異常的異常,不許要強制處理

throws 捕獲並向外拋出異常

throw拋出異常

try catch 是內部捕獲異常並做自定義處理

finally 是無論是否有異常都會被處理的語句,除非在 finally 前存在被執行的 System.exit(int i)時除外

 

 

異常的作用:

1,對程序的錯誤進行統一的封裝,當異常發生時,能夠告訴編程人員那里有異常,發生了什么異常。

2,可以使本來終斷的程序以適當的方式繼續運行,或退出,進行后處理數據回滾,資源釋放等。

28,

Erroe類及其子類表示為錯誤,它是不需要程序員處理也不能處理的異常,比如VirtualMachineError虛擬機錯誤,Thread線程僵死等。

RuntimeException類及其子類表示非受檢異常,是系統可能會拋出的異常,編譯器不要求強制處理的異常,常見的有NullPointException異常和IndexOutBoundException越界異常,

Exception類及其子類中除RuntimeException異常,表示受檢異常,是程序員必須處理的異常,不處理程序不能通過,IOException和SQLException異常。

29,

1) 對於 shorts1=1;s1=s1+1 來說,在s1+1 運算時會自動提升表達式的類型為 int, 那么將int賦予給 short類型的變量 s1會出現類型轉換錯誤。

2) 對於 short s1=1;s1+=1 來說 +=是java 語言規定的運算符,java 編譯器會對它 進行特殊處理,因此可以正確編譯。

30

ArrayList 和 LinkedList 都實現了 List 接口,他們有以下的不同點:

 ArrayList 是基於索引的數據接口,它的底層是數組。它可以以 O(1)時間復雜度對元素進行 隨機訪問。

LinkedList 是以元素列表的形式存儲它的數據,每一個元素都和它的 前一個和后一個元素鏈接在一起,在這種情況下,查找某個元素的時間復雜度是 O(n)。

相對於 ArrayList,LinkedList 的插入,添加,刪除操作速度更快,因為當元素被添加到集合 任意位置的時候,不需要像數組那樣重新計算大小或者是更新索引。 LinkedList 比 ArrayList 更占內存,因為 LinkedList 為每一個節點存儲了兩個引用,一個指 向前一個元素,一個指向下一個元素。

31

ArrayList 就是動態數組,是 Array 的復雜版本,動態的增加和減少元素.當更多的元素 加入到 ArrayList 中時,其大小將會動態地增長。它的元素可以通過 get/set 方法直接訪問, 因為 ArrayList 本質上是一個數組。初始容量為 10。

1.插入元素的時候可能擴容,刪除元素時不會縮小容量。

2.擴容增長為Arraylist 增長原來的 0.5 倍

3. 而 Arraylist 沒有設置增長空間 的方法。

4.線程不同步

Vector 和 ArrayList 類似, 區別在於 Vector 是同步類(synchronized).因此,開銷就比 ArrayList 要大。初始容量為 10。

實現了隨機訪問接口,可以隨機訪問。Vector 是內部是以動態數組的形式來存儲數據的。

1.Vector 還可以設置增長的空間大小,

2. 及 Vector 增長原 來的 1 倍

3.vector 線程同步

LinkedList 是一個雙鏈表,在添加和刪除元素時具有比 ArrayList 更好的性能.但在 get 與 set 方面弱於 ArrayList.當然,這些對比都是指數據量很大或者操作很頻繁的情況下的對 比。它還實現了 Queue 接口,該接口比 List 提供了更多的方法,包括 offer(),peek(),poll()等.

32,

Collection 是集合類的上級接口,繼承與他的接口主要有 Set 和 List。Collections 是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排 序、線程安全化等操作。

33

HashMap 是 Hashtable 的輕量級實現(非線程安全的實現),他們都完成了 Map 接口,主要區別在於 HashMap 允許空(null)鍵值(key),由於非線程安全,效 率上可能高於 Hashtable。  HashMap 允許將 null 作為一個 entry 的 key 或者 value,而 Hashtable 不允許。  HashMap 把 Hashtable 的contains 方法去掉了,改成 containsvalue 和 containsKey。 因為 contains 方法容易讓人引起誤解。 Hashtable 繼承自 Dictionary 類,而 HashMap 是 Java1.2 引進的 Map interface 的一個實現。  最大的不同是,Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在多個線 程訪問 Hashtable 時,不需要自己為它的方法實現同步,而 HashMap 就必須為 之提供外同步。 Hashtable 和 HashMap 采用的 hash/rehash 算法都大概一樣,所 以性能不會有很大的差異

34

ClassCastExcetion,NullPointerException,NumberFormatException, OutOfMemoryException,ArrayIndexOfBoundsException

35

答:不同點:定義上:Array 可以包含基本類型和對象類型,ArrayList 只能包含對象類 型。容量上:Array 大小固定,ArrayList 的大小是動態變化的。操作上:ArrayList 提供更多 的方法和特性,如:addAll(),removeAll(),iterator()等等。使用基本數據類型或者知道數 據元素數量的時候可以考慮 Array;ArrayList 處理固定數量的基本類型數據類型時會自動裝 箱來減少編碼工作量,但是相對較慢。

 

 

 

 

 
 
答案

37

func1

func2

2

1

38

懶漢式單例,在第一次調用的時候實例化自己:
public class Singleton{
    private Singleton(){}
    private static Singleton single=null;
    public static Singleton getInstance(){
        if(sing==null)
            single=new Singleton();
        return single;
    }}
靜態內部類:
public class Singleton{
    private static class Lazy{
        private static final Singleton INSTANCE=new Singleton();}
    private Singleton(){}
    public static final Singleton getInstance(){
        return LAZY.INSTANCE;
    }
}
餓漢式單例類,在初始化時,自行實例化。
public class Singletonon1{
    private Singleton1(){}
    private static final Singleton1 single=new Singleton1();
    public static Singleton1 getInsttance(){
        return single;
    }

雙重校驗鎖實現對象單例(線程安全):

public class Singleton {

 private volatile static Singleton uniqueInstance;
 private Singleton() { }
 public static Singleton getUniqueInstance() { 
        //先判斷對象是否已經實例過,沒有實例化過才進入加鎖代碼
    if (uniqueInstance == null) { 
            //類對象加鎖    
    synchronized (Singleton.class) { 
        if (uniqueInstance == null) { 
            uniqueInstance = new Singleton(); 
        } 
    } 
    } 
    return uniqueInstance; 
 } }

 

39

靠的是父類或接口定義的引用變量可以指向子類或具體實現類的實例對象,而程序調用的方

法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運 行的那個對象的方法,而不是引用變量的類型中定義的方法

40

1. 接口的方法默認是 public,所有方法在接口中不能有實現(Java 8 開始接口方法可以有默認實現),抽象類可以 有非抽象的方法

2. 接口中的實例變量默認是 final 類型的,而抽象類中則不一定

3. 一個類可以實現多個接口,但多只能實現一個抽象類

4. 一個類實現接口的話要實現接口的所有方法,而抽象類實現接口不一定

5. 接口不能用 new 實例化,但可以聲明,但是必須引用一個實現該接口的對象 從設計層面來說,抽象是對類的抽 象,是一種模板設計,接口是行為的抽象,是一種行為的規范。

6,JDK8中,接口也可以定義靜態方法,可以直接用接口名調用。實現類和實現是不可以調用的。如果同時實現 兩個接口,接口中定義了一樣的默認方法,必須重寫,不然會報錯。(

41

1

42,判斷對象類型,

當程序執行向下轉型操作的時候,如果父類對象不是子類對象的實例,就會發生異常,所以在執行向下轉型之前需要養成一個習慣,利用instanceof判斷父類對象是否為子類對象的實例,可以使用instanceof操作判斷是否一個類實現了某個接口和一個對象是否屬於一個實例。某類對象的引用 instanceof 某個類;返回類型為boolear值。

instanceof不允許存在泛型參數,

"String" instanceof String //返回值為true

new String() instanceof String //返回值為true

new Object() instanceof String //false(可以編譯)

'A' instanceof Character //編譯不通過,A為基本類型,Character為封裝類,前邊必須為對象。

null instanceof String //false,特殊規則,如果左操作數是null,結果就直接返回false,不在運運算右操作數,

(String)null instanceof String //false,null是一個萬用類型,可以說它沒有類型,即使類型轉換也是null。

new Date() instanceof String //編譯不通過,沒有繼承實現關系。

T(T為泛型String類變量) instanceof Date; //通過,false,T被編譯為Object類,傳遞String類的值,所以 "Object instanceof Date";

43,

Java泛型(Generic)的引入加強了參數類型的安全性,減少了樂行的轉化,Java泛型在編譯期有效,在運行期被刪除,即泛型參數類型在編譯后都會被清除掉。

轉化規則:

List< String>,List< Integer>,List擦除后的類型為List

List< String>[],類型擦除后是List[];

List<? extends E>,List<? super E>擦除后的類型為List.

List<T extends Serializable & Cloneable>擦除后為List< Serializable>

44,

不能初始化泛型參數和數組,new T();,new T(5)都不能通過,new ArrayList< T>()可以通過。ArrayList表面是泛型,其實已經在編譯期轉型為Object了,數組允許協變(Covariant),即可以容納所有對象,類的成員變量是在類初始化前初始化的,所有要求在初始化前它必須具有明確的類型,否則則就只能申明,不能初始化。

45,

Java泛型支持通配符,可以使用“?”,表示任意類,也可以使用extends 關鍵字表示某一個類的(接口)的子類型,可以使用super關鍵字表示某一個類(接口)的父類。

如果一個泛型結構即用作讀操作,又用作寫操作,使用確切的泛型類型即可。

在泛型結構中,只參與“讀”操作則限定上界(extends):

public static <E> void read(List<? extends list>) {

for( E e:list) {

}

}

泛型結構只參與"寫“操作則限定下界(super)。

public  static void write(List<? super  Number> lsit){

    lsit.add(123);

    lsit.add(33.14);

}

 

46,

 

 

47,涉及到類初始化時的加載順序,static方法和變量是在類初始化時首先被加載的,即在對象初始化之前就被加載了,是屬於類的,即沒有對象也可以執行。this表示當前對象,super表示父類對象,描述的是對對象的操作,把this和super放到static方法中不符合邏輯。那時候還沒有對象出現。會報空指針異常。,

48 第一個兩個對象,第二個一個對象。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM