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關鍵字從語義上解決多線程亂序問題