JAVA面試筆試之-java基礎

1.面向對象的特徵:繼承、封裝和多態
     實現多態的三種方式:1.接口實現,2.繼承父類重寫方法, 3. 同一類中方法進行重載
     
 2.重載和重寫的區別
        子類方法覆蓋父類方法是重寫(方法名,參數,返回值都相同); 重載是同名不同參數的方法;

3.final, finally, finalize 的區別
      final 是關鍵字用來修飾類,方法和變量, final 修飾的類不能被繼承,方法不能重寫, 變量不能重新複製;
      finally 是異常處理模型的補充, finally結構使代碼總會執行,不管有無異常發生;使用finally 可以維護對象的內部狀態,清理非內存資源
      finalize 是java.lang.object 定義的方法,每個對象都有這個方法,gc啓動 該對象被回收時調用,一個對象的finalize() 只會被調用一次

4.Exception、Error、運行時異常與一般異常有何異同

5.請寫出5種常見到的runtime exception
    nullponintException(空指針異常)
    indexOutofBoundException(數據越界)
    ClassCastException(類轉換異常)
    classnotfoundException(找不到指定的類)
    NumberFormatException(數字格式異常)
    SqlExcpetion(sql語句執行異常)

6.int 和 Integer 有什麼區別,Integer的值緩存範圍
    int 是一個基本類型,存儲數值; 而Integer 是int 的封裝類, 它提供處理數據的方法。 調用MIN_VALUE、MAX_VALUE 可以知道範圍 -2^31 -2^31-1;

7.包裝類,裝箱和拆箱
     

8.String、StringBuilder、StringBuffer
    String 是final類型,每次聲明都是不可變的對象,每次操作都會產生新的String 對象,
    String a = 'java' 這種方式,jvm 會將其分配到常量池中;
    String a = new String('java') jvm 會將其分配到堆內存;
    StringBuilder、StringBuffer 都是在原有對象上進行操作,StringBuffer 是線程安全的,StringBuffer是非線程安全,效率上更高
    效率比較: StringBuilder > StringBuilder > String.

9 抽象類去接口有什麼區別
      抽象類:子類用extends關鍵字繼承,如果子類不是抽象類,子類需要提供抽象類中所聲明方法的實現;
                      抽象類中可以有構造器;不能被實例化;一個子類只存在一個父類;
      接口:子類用implements實現接口,需要提供接口中所有聲明的實現;                 
      接口不能有構造器;不能實例化;一個子類可以存在多個接口;

  
10.說說反射的用途及實現
       反射的核心是JVM在運行時才動態加載類或調用方法/訪問屬性,它不需要事先(寫代碼的時候或編譯期)知道運行對象是誰。
      一、Java反射框架主要提供以下功能:
        1.在運行時判斷任意一個對象所屬的類;
        2.在運行時構造任意一個類的對象;        
        3.在運行時判斷任意一個類所具有的成員變量和方法(通過反射甚至可以調用private方法);        
        4.在運行時調用任意一個對象的方法
        
      二、主要用途 :        
        1、反射最重要的用途就是開發各種通用框架。    
            
     三、基本反射功能的實現(反射相關的類一般都在java.lang.relfect包裏):        
        1、獲得Class對象        
        使用Class類的forName靜態方法        
        直接獲取某一個對象的class        
        調用某個對象的getClass()方法
                
        2、判斷是否爲某個類的實例        
        用instanceof關鍵字來判斷是否爲某個類的實例    
            
        3、創建實例        
        使用Class對象的newInstance()方法來創建Class對象對應類的實例。        
        先通過Class對象獲取指定的Constructor對象,再調用Constructor對象的newInstance()方法來創建實例。
        
        4、獲取方法        
        getDeclaredMethods()
        
        5、獲取構造器信息        
        getDeclaredMethods()        
        getMethods()        
        getMethod()
        
        6、獲取類的成員變量(字段)信息        
        getFiled: 訪問公有的成員變量        
        getDeclaredField:所有已聲明的成員變量。但不能得到其父類的成員變量        
        getFileds和getDeclaredFields用法
        
        7、調用方法        
        invoke()
        
        8、利用反射創建數組        
        Array.newInstance()
        
        四、注意:        
        由於反射會額外消耗一定的系統資源,因此如果不需要動態地創建一個對象,那麼就不需要用反射。        
        另外,反射調用方法時可以忽略權限檢查,因此可能會破壞封裝性而導致安全問題。

11.說說自定義註解的場景及實現
     
14.列出自己常用的JDK包
     java.lang:幾桶基礎類,String,Math,Integer,system,和thread 提供常用功能
     java.io:輸入輸出有關的類,比如文件操作等
     java.net: 網絡有關的類,比如URL,URLConnection
     java.util:系統輔助類,特別是集合類Connection,list,Map 等
     java.sql :數據庫操作類,Connection,Sratement,ReaultSet    
 

16.equals與==的區別
    String a = "java"; //jvm 方法區
    String b = new String("java"); //堆內存
    String c = new String("java"); //堆內存
    a ==b false; a.equals(b) true; b==c false; b.equals(c) true;
    等於比較的是內存地址 ,equals 比較的是內容

17.hashCode和equals方法的區別與聯繫
     如果兩個對象根據equals()方法比較相等,那麼調用hashcode()方法必須產生相同的哈希值
     如果equals()方法比較不相等,哈希值不一定相等(哈希碰撞還是會相等)

18.什麼是Java序列化和反序列化,如何實現Java序列化?或者請解釋Serializable 接口的作用

19.Object類中常見的方法,爲什麼wait  notify會放在Object裏邊?

21.JDK和JRE的區別
    Jdk是編譯時環境 .java 文件  編譯成.class 文件需要的 ,jre 是jvm 運行.class 文件的環境,是運行時環境

22.Java 8有哪些新特性
    一是 Date/Time api  以前calendar 不太好解一些時間轉換的問題,8增加了 localdate、localtime;
    二是對Base64編碼的支持已經被加入到Java 8官方庫中,這樣不需要使用第三方庫就可以進行Base64編碼 

    
23. 靜態變量和實例變量的區別
        靜態變量存儲在方法區中,屬於類所有;
        實例變量存放在堆內存當中,其引用地址存放在當前線程棧。

  
 24.java 創建對象的幾種方式
       1.採用new() 耦合度最高
       2.通過反射
       3.採用clone
       4.通過序列化機制

      
  25.switch 能否使用String
        jdk1.7 只支持byte ,short,char,int 或者其對應的封裝類以及枚舉類,1.7 後開始支持String
        
  26.object 中有哪些公共方法
       equals() ,clone(),getClass(), toSting(), notify(),notifyAll(), wait()
       
  27.a= a+b 與 a +=b 有區別嗎?
             相同數據類型運行結果沒有區別, a+=b 會進行類型的自動轉換, 而 a= a+b 需要強制轉換。 不轉換,會編譯出錯 
             
  28.String str = 我喜歡看<肖申克的救贖> ; 把<> 中的字提取出來  
          1.str.substring(str.indexOf('<')+1, str.indexOf('>'))   
          
  29. int a = 5; int b =6 在不定義第三個變量的情況下交換數值
         b=a; a+=b;    
  
  30.float f =3.5 是否正確?
           不正確,double 類型;float 定義方式:float f =3.5f; 
  
  31.transient 變量有什麼特點 ?
      transient 關鍵字 可用於控制序列化,因爲它指定了可從序列化中排除的對象屬性;
      標記爲transient 的對象特性或屬性將不會被保存到磁盤中。

      
  32. 斷言的用途
       用於程序測試期間做單元測試
  
  33.Math.round(-1.5) 結果;
          -1 ;
  
  34.java 異常體系與使用異常時應該注意的原則?
  
  35.volatile VS synchronized
      volatile 使用場景 :在兩個或者更多的線程訪問的成員變量上使用volatile。當要訪問的變量已在synchronized代碼塊中,或者爲常量時,不必使用。 
      volatile 能保證對象的可見性,即在工作內存的內容更新能立即在主內存中可見  ,volatile關鍵字從語義上解決多線程亂序問題

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章