1. 程式人生 > 其它 >Java面試知識點3

Java面試知識點3

技術標籤:java面試

1.java.sql.Date和java.util.Date的區別?

java.sql.Date是java.util.Date的子類;
java.util是JDK中的日期類,精確到時、分、秒、毫秒;
java.sql.date與資料庫Date向對應的一個型別,只有日期部分,時分秒都會設定為0,如2020-04-05 00:00:00;
要從資料庫時間欄位取 時、分、秒、毫秒資料,可以使java.sql.Timestamp。

2…關於構造方法

java類中不寫構造方法,編譯器會預設提供一個無參構造(即類中的構造方法可以省略);
方法名可以與類名相同,但不符合命名規範;
一個類中可以定義多個構造方法(引數不一致,即過載);

構造方法在一個物件被建立(new)時執行。

3.Java中介面的修飾符可以是?

private,protected,final不行,abstract可以;
介面中的訪問許可權修飾符只能是public或default;
介面中的方法必須要實現類實現,所以不能使用final;
介面中所有方法預設都是abstract,通常abstract省略不寫。

4.關於關鍵字的使用

1.static方法能處理非static的屬性(錯誤)原因:載入class時首先完成static方法裝載,非static屬性和方法還沒完成初始化,所以不能呼叫;
2.abstract方法必須在abstract類中(對);
3.abstract類中可以有private的成員(對);

4.abstract不能與final並列修飾同一個類(對)。

5.關於記憶體回收

1.記憶體回收程式負責釋放無用記憶體(錯)原因:記憶體由JVM負責釋放,程式設計師無法直接釋放記憶體,垃圾回收時間不確定;
2.必須建立一個執行緒來釋放記憶體(對);
3.記憶體回收程式可以在指定的時間釋放記憶體物件(對);
4.記憶體回收程式允許程式設計師直接釋放記憶體(對)。

6.說說對面向物件的理解

對java來說,一切皆是物件
物件具有以下特點:

  1. 物件具有屬性和行為;
  2. 物件具有變化的轉態;
  3. 物件具有唯一性;
  4. 物件都是某個類別的例項。

面向物件的特性:

  1. 抽象性:抽象是將一類物件的共同特徵總結出來構造類的過程,包括資料抽象和行為抽象兩方面;
  2. 繼承性:指子類擁有父類的全部特徵和行為,這是類之間的一種管子,java只支援單繼承;
  3. 封裝線:封裝是將程式碼及其處理的資料繫結在一起的一種程式設計機制,該機制保證了程式和資料都不受外部干擾且不被無用,封裝的目的在於保護資訊;
  4. 多型性:多型性體現在父類的屬性和方法被子類繼承後或介面實現類實現後,可以具有不同的屬性或表現方式。

7.記憶體洩漏和記憶體溢位的區別

記憶體溢位(out of memory):指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;

記憶體洩漏(memory leak):指程式在申請記憶體後,無法解釋已申請的記憶體空間,記憶體洩漏堆積會導致記憶體被佔光;

memory leak最終會導致out of memory。

8.不通過構造方法能建立物件嗎?

Java建立物件的方式
1.用new語句建立物件;
2.運用反射,呼叫java.lang.Class或java.lang.reflect.Constructor類的newInstance()方法
3.呼叫物件的clone()方法;
4.運用反序列化手段,呼叫java.io.ObjectInputStream物件的readObject()方法;
1和2會呼叫建構函式,3和4不會呼叫建構函式。

9.匿名內部類可以繼承或實現介面嗎?為什麼?

匿名內部類本質上是對父類方法的重寫 或 介面的方法的實現。

從語法角度看,匿名內部類建立處是無法使用關鍵字繼承類或實現介面。
原因:

  1. 匿名內部類沒有名字,所以它沒有建構函式,因為沒有建構函式,所以它必須通過父類的建構函式來例項化,即匿名內部類完成把建立物件的任務交給了父類去完成;
  2. 匿名內部類裡建立新的方法沒有太大意義,新方法無法被呼叫;
  3. 匿名內部類一般都是用來覆蓋父類的方法;
  4. 匿名內部類沒有名字,所以無法進行向下的強制型別轉換,只能持有匿名內部類物件引用的變數型別的直接或間接父類。

10.什麼是多型?如何實現?好處?

多型:同一個介面,使用不同的例項而執行不同操作,同一個行為具有多個不同表現形式或形態的能力.
實現多型的三個條件:

  1. 繼承;
  2. 子類重寫父類的方法;
  3. 父類引用變數指向子類物件;

實現多型的技術稱為:動態繫結,是指在執行期間判斷所引用物件的實際型別,根據其實際型別的型別呼叫其相應的方法;

Java中使用父類的引用變數呼叫子類重寫的方法,即可實現多型;
好處:

  1. 消除型別之間的耦合關係;
  2. 可替換性 ;
  3. 可擴充性
  4. 介面性;
  5. 靈活性;
  6. 簡化性。

11.同步程式碼塊和同步方法有什麼區別?

1.同步方法就是在方法前加關鍵字synchronized;同步程式碼塊則是在方法內部使用synchronized;

2.加鎖物件相同的話,同步方法鎖的範圍大於等於同步程式碼塊,一般加鎖範圍越大,效能越差;

3.同步方法如果是static方法,等同於同步方法塊鎖在該Class物件上。

12.內部類和靜態內部類有什麼區別?

1.靜態內部類不需要有指向外部類的引用;非靜態內部類需要持有對外部類的引用;

2.靜態內部類可以有靜態方法,屬性;非靜態內部類則不能有靜態方法、屬性;

3.靜態內部類只能訪問外部類的靜態成員,不能訪問外部類的非靜態成員;非靜態內部類能夠訪問外部類的靜態和非靜態成員;

4.靜態內部類不能依賴於外部類的例項,直接例項化內部類物件;非靜態內部類通過外部類的物件例項生成內部類物件。

13…存在 i+1< i 的值嗎?

存在,如 Integer.MAX_VALUE;
因為Integer.MAX_VALUE是正數,而Integer.MAX_VALUE+1=-2147483648。

14.可序列化物件為什麼要定義serialversionUID值?

1.SerialVersionUid是為了序列化物件版本控制,告訴JVM各版本反序列化時是否相容;

2.如果在新版本中這個值修改了,新版本就不會相容舊版本,反序列化時就會丟擲InvalidClassException異常;

3.僅增加了一個屬性,希望向下相容,老版本的資料都保留。就不用修改;

4.刪除了一個屬性,或更改了類的繼承關係,就不能不相容舊資料,這時應該動手更新SerialVersionUid。

15.final修飾變數,是引用不能變?還是引用的物件不能變?

1.final修飾基本型別變數,值不能改變;
2.final修飾引用型別變數,棧記憶體中的引用不能改變,所指向的堆記憶體中的物件的屬性值可能可以改變。

16.以下正則表示式的含義

\d:匹配一個數字字元,等價於[0-9];
\D:匹配一個非數字字元,等價於[^0-9];
\s:匹配任何空白字元,包括空格、製表符、換頁符等,等價於[\f\n\r\t\v]. :匹配除換行符\n之外的任何單字串,匹配 . 符號需要轉義,使用 \.;
* :匹配前面的子表示式零次或多次,匹配*字元需要轉義,使用\*;
| :將兩個匹配條件進行邏輯 或 運算;
+ :匹配前面的子表示式一次或多次,要匹配 + 字元需要轉義,使用\+;
[0-9]{6}:匹配連續6個0-9之間的數字;

17.Java屬於編譯型還是解釋型語言?

計算機不能理解高階語言,只能理解和執行機器語言,必須把高階語言翻譯成機器語言。
翻譯有兩種方式:1.編譯 2.解釋;

用編譯型的語言寫的程式執行之前,需要一個編譯過程,通過編譯系統把高階語言翻譯成機器語言,把源高階程式編譯成機器語言檔案,以後直接執行而不需要編譯了,所以編譯型語言的程式執行效率高;
解釋型語言在執行的時候才解釋稱機器語言,每個語句都是執行的時候才翻譯的,每執行一次翻譯一次,效率低;

Java是一種兼具編譯和解釋性特點的語言,.java檔案會被編譯成與平臺無關的.class檔案,但是.class位元組碼檔案無法被計算機直接識別,仍需要JVM翻譯成機器語言,所以嚴格來說,Java是一種解釋型語言。

18.基本型別byte表示的數值範圍是多少,System.out.println(‘a’ + 1)的結果是多少?

128~127

'a’是char型別,1是int型別;
int與char相加,char會強轉int,char的ASCII碼值是97,加一起為98。

19.靜態與非靜態成員變數區別?

1.生命週期不同:非靜態成員變數隨著物件的建立而存在;靜態成員變數隨著類的載入而存在;
2.呼叫方式不同:非靜態成員變數用 物件名.變數名 呼叫;靜態成員變數用 類名.變數名,JDK1.7後也能用 物件名.變數名 呼叫;
3.別名不同:非靜態成員變數也可以稱為例項變數;靜態變數稱為類變數;
4.資料儲存位置不同:成員變數資料儲存在堆記憶體的物件中,物件的特有資料儲存在方法區(共享資料區)的靜態區,物件的共享資料。

20.日期型別如何格式化?字串如何轉日期?

日期轉字串
DateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
String time = sdf.format(new Date());

字串轉日期
DateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
String s = “2020-04-06 12:22:33”;
Date date = sdf.parse(s);