java/javaee基礎面試問題


1.面向對象和面向過程的區別對比:

面向對象易維護、易擴展、易復用,由於面向對象繼承、封裝、多態的特性,可以設計低耦合的系統易於維護,但因為類的實例化開銷較大,所以面向過程性能更高,一般性能是最主要的因素時采用面向過程開發,它沒有面向對象那么易維護易擴展易復用。

 

2.java語言的特點

跨平台、面向對象,支持多線程、支持網絡編程。

 

3.JVM,JDK,JRE都是什么

jvm是運行java字節碼的虛擬機,對不同的系統又不同的實現,讓相同的代碼在不同的機器上都能出一樣的結果。

JRE是java的運行環境,它是運行已編譯 Java 程序所需的所有內容的集合,包括 Java虛擬機(JVM),Java類庫,java命令和其他的一些基礎構件。

JDK是Java Development Kit,它是功能齊全的Java SDK。它擁有JRE所擁有的一切,還有編譯器(javac)和工具(如javadoc和jdb)。它能夠創建和編譯程序。

 

4.什么是java字節碼

jvm可以理解的代碼就是字節碼,(就是擴展名是.class文件),它不需要任何特定的處理器,只面向虛擬機。jvm和字節碼實現一次編譯隨處運行。

 

5.從java代碼到運行起來又哪些步驟?

java源代碼通過jdk中的編譯器編譯生成jvm理解的lava字節碼,然后jvm可以運行字節碼。

 

6.java和c++區別是什么?

都是面向對象語言,都支持封裝、繼承和多態。c++可以操作指針,Java 不提供指針來直接訪問內存。Java 的類是單繼承的,C++ 支持多重繼承;java的接口可以多繼承。Java 有自動內存管理機制,不需要程序員手動釋放無用內存。

 

7.構造器是否可以被重寫?

構造器不可以,在繼承的時候,子類也無法獲得父類的構造器和私有的屬性。一般要用父類的構造器都是用super,加載順序?先加載父類吧,那super什么時候執行?

補充:可以重載。

 

8.說說面向對象

面向對象有封裝、多態繼承三個特征。

封裝是屬性私有化,對外提供訪問的方法,繼承可以通過繼承父類實現方法的復用,多態是聲明父類指向子類的實例。

好處是什么?常用的場景

 

9.String,StringBuffer,StringBuilder的區別,為什么String不可變

1.String是不可變的,StringBuffer,StringBuilder可變

2.線程安全上的差別,String因為不可變是線程安全的的,StringBuffer加了同步鎖也是線程安全的,StringBuilder線程不安全。
使用上的選擇:如果字符串不會更改,使用String類。如果字符串可以更改並且只能從單個線程訪問,則使用a StringBuilder就足夠了。如果字符串可以更改,並且將從多個線程訪問,請使用StringBuffer。
 
10.java中定義一個不做事且沒有參數的構造方法是干什么的?
java程序在執行子類的構造方法的時候,如果沒有一個super明確調用一個父類的構造方法,就會調用父類無參數的構造方法,為了防止子類不寫super發生編譯錯誤,就加上一個沒有參數的構造方法。
 
11.類可不可以不寫構造方法?
如果類一個構造方法都沒寫,那默認會給它一個無參的。
 
12.接口和抽象類的區別:

  從設計層面上看,抽象類提供了一種 IS-A 關系,子類對象必須能夠替換掉所有父類對象(里氏替換)。而接口更像是一種 LIKE-A 關系,它只是提供一種方法實現契約,並不要求接口和實現接口的類具有 IS-A 關系。看不 明白

從使用上來看,一個類可以實現多個接口,但是不能繼承多個抽象類。

接口的字段只能是 static 和 final 類型的,而抽象類的字段沒有這種限制。

接口的成員只能是 public 的,而抽象類的成員可以有多種訪問權限。

抽象類一般會包含抽象方法,抽象方法一定位於抽象類中。

接口是抽象類的延伸,在 Java 8 之前,它可以看成是一個完全抽象的類,從 Java 8 開始,接口也可以擁有默認的方法實現,因為不支持默認方法的接口的維護成本太高了。在 Java 8 之前,如果一個接口想要添加新的方法,那么要修改所有實現了該接口的類。

備注:在JDK8中,接口也可以定義靜態方法,可以直接用接口名調用。實現類和實現是不可以調用的。如果同時實現兩個接口,接口中定義了一樣的默認方法,必須重寫,不然會報錯。

 

13.對象相等和引用相等的區別:對象相等比較的是內存中的內容,引用比較的是地址

 

14.==和equals,==對於基本類型比較值,對於引用類型比較地址;equals方法如果沒有被覆蓋和==一樣,如果被覆蓋了就根據內容比較。42 == 42.0為什么是true

 

15.為什么重寫equasl的時候也要重寫hashCOde?

因為equals()用來判斷兩個對象是否等價,hashCode是根據對象的內容算出散列值,要求等價的兩個對象散列值一定相等,所以 equals()的時候應該一起覆蓋hashcode(),保證等價的兩個對象散列值也相等。
 
16。線程,程序,進程
程序是靜態的概念,是靜態的代碼,進程是程序的一次執行過程,是資源分配和調度的基本單位。
 
17.關於final關鍵字
 final修飾的基本類型數據,那么值不可改變,如果是引用類型,那么引用不可變。
 final修飾一個類,那么類不能被繼承,
 final修飾的方法,在繼承體系中可以防止子類重寫。
 
18.java中的異常
異常的祖先是Throwable類,下面有Error和Exception兩個子類,Error一般是程序運行時jvm出現的問題,比如oom,Exception是程序本身可以處理的異常。
finally哪怕try和catch里面有return也會執行。
 
19.什么是受檢異常和非受檢異常?
受檢異常是編程錯誤,自己無法預料的,所有 RuntimeException和它的子類還有 Error,他們不需要不需要在編譯的時候處理。
受檢異常是可以恢復的,比如讀寫文件要catch IOException。
 
20.java序列化中有些字段不想序列化怎么辦?
對不想序列化的變量用transient。
transient關鍵字的作用是:阻止實例中那些用此關鍵字修飾的的變量序列化;當對象被反序列化時,被transient修飾的變量值不會被持久化和恢復。transient只能修飾變量,不能修飾類和方法。
 
21.static的用法:
 修飾變量和方法。被static修飾的東西放在方法區。
 靜態代碼塊(靜態代碼塊—>非靜態代碼塊—>構造方法,該類不管創建多少對象,靜態代碼塊只執行一次)
 靜態內部類。
 靜態倒包。
 
22.Java反射
 
23.對象的深淺拷貝
在拷貝的時候,如果對於基本數據類型進行值傳遞,對於引用數據類型進行引用傳遞,那么就是淺拷貝。
深拷貝是基本類型值傳遞,引用類型創建一個新對象,並復制其中的內容是深拷貝。
 
java中的clone(),來自Object類,無論深淺拷貝都用它。
https://segmentfault.com/a/1190000010648514
 
來自https://github.com/Snailclimb/JavaGuide


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM