面經總結:J2SE
-
面向對象的特性?
-
static可以修飾什麽?final可以修飾什麽?
static 可以修飾什麽:成員變量、成員方法、靜態塊;
final 可以修飾什麽:成員變量、成員方法、類;
一、final關鍵字可以用來修飾類、方法、變量。各有不同。
A、修飾類(class)。
1、該類不能被繼承。
2、類中的方法不會被覆蓋,因此默認都是final的。
3、用途:設計類時,如果該類不需要有子類,不必要被擴展,類的實現細節不允許被改變,那麽就設計成final類
B、修飾方法(method)
1、該方法可以被繼承,但是不能被覆蓋。
2、用途:一個類不允許子類覆蓋該方法,則用final來修飾
3、好處:可以防止繼承它的子類修改該方法的意義和實現;更為高效,編譯器在遇到調用fianal方法轉入內嵌機制,提高了執行效率。
4、註意:父類中的private成員方法不能被子類覆蓋,因此,private方法默認是final型的(可以查看編譯後的class文件)
C、修飾變量(variable)
1、用final修飾後變為常量。包括靜態變量、實例變量和局部變量這三種。
2、特點:可以先聲明,不給初值,這種叫做final空白。但是使用前必須被初始化。一旦被賦值,將不能再被改變。
D、修飾參數(arguments)
1、用final修飾參數時,可以讀取該參數,但是不能對其作出修改
二、final關鍵字不能用來抽象類和接口。
-
Java修飾符的範圍?
成員變量的修飾符:
private:自身可以訪問,同包子類不能繼承,同包類不能訪問;
默認:自身可以訪問,同包子類可以繼承,同包類可以訪問;
protected:自身可以訪問,同包子類可以繼承,不同包子類可以繼承,同包類可以訪問,其他類不可以訪問;
public:不同包子類可以繼承,其他類可以訪問;
public > protected > default > private
public 指定該變量為公共的,他可以被任何對象的方法訪問。
private 指定該變量只允許自己的類的方法訪問,其他任何類(包括子類)中的方法均不能訪問。
protected 指定該變量可以被自身和子類訪問。在子類中可以覆蓋此變量
-
== 和 equals 的區別?
(1.基本類型; 2.基本類型封裝;3.String;4.非字符串變量)
equals()是Object類的方法;
(1) 如果是基本類型比較,那麽只能用==來比較,用equals會編譯錯誤,因為不是對象。int a = 3;
(2) 對於基本類型的包裝類型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用變量,==是比較地址的,而equals是比較內容的。Integer n1 = new Integer(30);
(2.5)對於String a = “a”; Integer b = 1;這種類型的特有對象創建方式,==的時候值是相同的。
(3)對於字符串變量來說,使用“==”和“equals()”方法比較字符串時,其比較方法不同。
“==”比較兩個變量本身的值,即兩個對象在內存中的首地址。
“equals()”比較字符串中所包含的內容是否相同。
String s1 = "123";
String s2 = "123";
String s4 = new String("123");
String s5 = new String("123");
s1==s2 true; s1.equals(s2) true;
s4==s5 false; s4.equals(s5) true;
s1==s4 false; s1.equals(s4) true;
s1/s2分別指向字符串常量"123"創建的對象,在常量池裏只有一個對象,內容為"123";
s4/s5兩個引用對象指向的對象內容相同,但是new操作符創建的,內存中分配兩塊空間給這兩個對象,所以內存地址不同。
(4)對於非字符串變量來說,"=="和"equals"方法的作用是相同的都是用來比較其對象在堆內存的首地址,即用來比較兩個引用變量是否指向同一個對象。
-
基本數據類型?
基本類型有八種:
整型4種:byte/short/int/long 字節數:1/2/4/8
字符型1種:char 2
浮點型2種:float/double 4/8
布爾型1種:boolean 1/8
一個字節等於8位,等於256個數,就是-128到127
大寫的B表示Bytes=字節;小寫的b表示bit=位;1byte=8bit;
自動轉換:(小可轉大,大轉小會失去精度)
byte -> short/char -> int -> long -> float -> double
- error/exception/runtime exception區別?
Error和Exception都實現了Throwable接口
Error指的是JVM層面的錯誤,比如內存不足OutOfMemoryError
Exception 指的是代碼邏輯的異常,比如下標越界OutOfIndexException
Exception分為可查異常CheckedException和運行時異常RuntimeException:
可查異常是必須處理的異常,要麽try catch住,要麽往外拋,誰調用,誰處理,比如 FileNotFoundException、IOException、SQLException等。如果不處理,編譯器就不讓你通過。
運行時異常 又叫做非可查異常,在編譯過程中,不要求必須進行顯示捕捉。
常見的Runtime Excepiton?
NullPointerException 空指針異常
ArithmeticException 算術異常,比如除數為零
ClassCastException 類型轉換異常
ConcurrentModificationException 同步修改異常,遍歷一個集合的時候,刪除集合的元素,就會拋出該異常
IndexOutOfBoundsException 數組下標越界異常
NegativeArraySizeException 為數組分配的空間是負數異常
為什麽分兩種異常?
Java之所以會設計運行時異常的原因之一,是因為下標越界,空指針這些運行時異常太過於普遍,如果都需要進行捕捉,代碼的可讀性就會變得很糟糕。
-
object類的方法?
9種;(簡要介紹各方法)
1.對象的復制/獲取/String/釋放:clone/getClass/toString/finalize;
2.hash:equals/hashCode;
3.多線程:wait/notify/notifyAll
clone:實現對象的淺復制;
getClass:獲得運行時類對象;
finalize:用於釋放資源;
equals:比較對象是否相等;基本類型不可以用equals,對於String類型“equals”和“==”作用不同;
hashcode:用於hash尋找;
wait:使當前線程等待該對象的鎖,當前線程必須是該對象的擁有者,也就是具有該對象的鎖;wait()方法一直等待,直到獲得鎖或者被中斷。wait(longtimeout)設定一個超時間隔,如果在規定時間內沒有獲得鎖就返回。
調用該方法後當前線程進入睡眠狀態,直到以下事件發生:
(1)其他線程調用了該對象的notify方法。
(2)其他線程調用了該對象的notifyAll方法。
(3)其他線程調用了interrupt中斷該線程。
(4)時間間隔到了。
此時該線程就可以被調度了,如果是被中斷的話就拋出一個InterruptedException異常。
notify:喚醒在該對象上等待的某個線程
-
反射機制?
-
抽象類和接口的區別?
-
Class中方法的執行順序?
static{} > {} > className{} > method(){}
靜態代碼塊>匿名方法塊>構造方法>普通方法。
面經總結:J2SE