1. 程式人生 > 其它 >Java基礎面試題-5

Java基礎面試題-5

18、switch語句能否作用在byte、long、string上?

在 switch(expr 1) 中,expr1 只能是⼀個整數表示式或者列舉常量。byte、short、char 都可以隱式轉換為 int,所以這些型別以及這些型別的包裝型別也都是可以的。⽽ long 和 String 型別都不符合 switch 的語法規定,並且不能被隱式的轉換為 int 型別,所以,它們不能作⽤於 switch 語句中。不過,需要注意的是在 JDK1.7 版本之後 switch 就可以作⽤在 String 上了。

switch case 語句有如下規則:

  • switch 語句中的變數型別可以是: byte、short、int 或者 char。從 Java SE 7 開始,switch 支援字串 String 型別了,同時 case 標籤必須為字串常量或字面量。
  • switch 語句可以擁有多個 case 語句。每個 case 後面跟一個要比較的值和冒號。
  • case 語句中的值的資料型別必須與變數的資料型別相同,而且只能是常量或者字面常量。
  • 當變數的值與 case 語句的值相等時,那麼 case 語句之後的語句開始執行,直到 break 語句出現才會跳出 switch 語句。
  • 當遇到 break 語句時,switch 語句終止。程式跳轉到 switch 語句後面的語句執行。case 語句不必須要包含 break 語句。如果沒有 break 語句出現,程式會繼續執行下一條 case 語句,直到出現 break 語句。
  • switch 語句可以包含一個 default 分支,該分支一般是 switch 語句的最後一個分支(可以在任何位置,但建議在最後一個)。default 在沒有 case 語句的值和變數值相等的時候執行。default 分支不需要 break 語句。

例項:

public class Test {
   public static void main(String args[]){
      //char grade = args[0].charAt(0);
      char grade = 'C';
 
      switch(grade)
      {
         case 'A' :
            System.out.println("優秀"); 
            break;
         case 'B' :
         case 'C' :
            System.out.println("良好");
            break;
         case 'D' :
            System.out.println("及格");
            break;
         case 'F' :
            System.out.println("你需要再努力努力");
            break;
         default :
            System.out.println("未知等級");
      }
      System.out.println("你的等級是 " + grade);
   }
}

編譯以上程式,輸出結果為:

良好
你的等級是 C

19、Object的常用方法有哪些?

clone方法:用於建立並返回當前物件的一份拷貝;

getClass方法:用於返回當前執行時物件的Class;

toString方法:返回物件的字串表示形式;

finalize方法:例項被垃圾回收器回收時觸發的方法;

equals方法:用於比較兩個物件的記憶體地址是否相等,一般需要重寫;

hashCode方法:用於返回物件的雜湊值;

notify方法:喚醒一個在此物件監視器上等待的執行緒。如果有多個執行緒在等待只會喚醒一個。

notifyAll方法:作用跟notify()一樣,只不過會喚醒在此物件監視器上等待的所有執行緒,而不是一個。

wait方法:讓當前物件等待;

。。。

20、final、finally、finalize的區別?

final:用於宣告屬性、方法和類,分別表示屬性不可更改、方法不可重寫、被其修飾的類不可被繼承;

Java關鍵字final有“這是無法改變的”或者“終態的”含義,它可以修飾非抽象類、非抽象類成員方法和變數。

  • final類不能被繼承,沒有子類,final類中的方法預設是final的。
  • final方法不能被子類的方法覆蓋,但可以被繼承。
  • final成員變量表示常量,只能被賦值一次,賦值後值不再改變。
  • final不能用於修飾構造方法。

注意:父類的private成員方法是不能被子類方法覆蓋的,因此private型別的方法預設是final型別的。
1、final類

final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,預設都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會載被擴充套件,那麼就設計為final類。

2、final方法
如果一個類不允許其子類覆蓋某個方法,則可以把這個方法宣告為final方法。使用final方法的原因有二:
把方法鎖定,防止任何繼承類修改它的意義和實現。
高效,編譯器在遇到呼叫final方法時候會轉入內嵌機制,大大提高執行效率。

finally:異常處理語句結構的一部分,表示總是執行;

finalize:Object類的一個方法,在垃圾回收時會呼叫被回收物件的finalize;

21、==和equals的區別?

==:如果比較的物件是基本資料型別,則判斷比較的數值是否相等;如果比較的是引用資料型別,則判斷比較的是物件的地址值是否相等;

equals方法:用來比較兩個物件的內容是否相等。

注意:equals方法不能用於比較基本資料型別的變數。在沒有重寫equals()方法的類中,呼叫equals()方法其實和使用==的效果一樣。(很多類重寫了equals方法,比如String、Integer等把它變成了內容比較,所以一般情況下equals比較的是內容是否相等)

Object類equals()方法原始碼:

public boolean equals(Object obj) {
     return (this == obj);
}

String類equals()方法原始碼(重寫Object類equals()方法):

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

經典示例:

String str3 = "abc";
String str4 = "abc";
System.out.println(str3 == str4); // true

str3與str4相等的原因是用到了記憶體中的常量池,當執行到str3建立物件時,如果常量池中沒有,就在常量池中建立一個物件"abc",第二次建立的時候,就直接使用,所以兩次建立的物件其實是同一個物件,它們的地址值相等。