JAVA面試要點-基本功-精簡答案

面向對象的特徵

抽象: 抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。比如,我們要設計一個學生成績管理系統,考察學生這個對象時,我們只關心他的班級、學號、成績等,而不用去關心他的身高、體重這些信息。抽象包括兩個方面,一是過程抽象,二是數據抽象。過程抽象是指任何一個明確定義功能的操作都可被使用者看作單個的實體看待,儘管這個操作實際上可能由一系列更低級的操作來完成。數據抽象定義了數據類型和施加於該類型對象上的操作,並限定了對象的值只能通過使用這些操作修改和觀察。

繼承: 繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和實例變量,並且類可以修改或增加新的方法使之更適合特殊的需要。這也體現了大自然中一般與特殊的關係。繼承性很好的解決了軟件的可重用性問題。比如說,所有的Windows應用程序都有一個窗口,它們可以看作都是從一個窗口類派生出來的。但是有的應用程序用於文字處理,有的應用程序用於繪圖,這是由於派生出了不同的子類,各個子類添加了不同的特性。

封裝: 封裝是面向對象的特徵之一,是對象和類概念的主要特性。封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。面向對象計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。一旦定義了一個對象的特性,則有必要決定這些特性的可見性,即哪些特性對外部世界是可見的,哪些特性用於表示內部狀態。在這個階段定義對象的接口。通常,應禁止直接訪問一個對象的實際表示,而應通過操作接口訪問對象,這稱為信息隱藏。事實上,信息隱藏是用戶對封裝性的認識,封裝則為信息隱藏提供支持。封裝保證了模塊具有較好的獨立性,使得程序維護修改較為容易。對應用程序的修改僅限於類的內部,因而可以將應用程序修改帶來的影響減少最低限度。

final, finally, finalize 的區別

finally

在異常處理時提供finally塊來執行任何清除操作。如果拋出一個異常,那麼相匹配的catch子句就會執行,然後控制就會進入finally塊(如果有的話)。

finalize方法名。java技術允許使用finalize()方法在垃圾收集器將對象從內存中清除出去之前做好必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用的情況下對這個對象的調用。它是在object類中定義的,因此所有的類都繼承了它。子類覆蓋finalize()方法以整理系統資源或者執行其他清理工作。finalize()方法是在垃圾收集器刪除對象之前對這個對象的調用。

int 和 Integer 有什什麼區別

1、Integer是int提供的封裝類,而int是Java的基本數據類型;

2、Integer默認值是null,而int默認值是0;

4、Integer是對象,用一個引用指向這個對象,而int是基本類型,直接存儲數值。

重載和重寫的區別

方法重載是指同一個類中的多個方法具有相同的名字,但這些方法具有不同的參數列表,即參數的數量或參數類型不能完全相同

方法重寫是存在子父類之間的,子類定義的方法與父類中的方法具有相同的方法名字,相同的參數表和相同的返回類型

(1)子類中不能重寫父類中的final方法

(2)子類中必須重寫父類中的abstract方法

抽象類和接 口有什什麼區別

接口是公開的,裡面不能有私有的方法或變量,是用於讓別人使用的,而抽象類是可以有私有方法或私有變量的,

另外,實現接口的一定要實現接口裡定義的所有方法,而實現抽象類可以有選擇地重寫需要用到的方法,一般的應用裡,最頂級的是接口,然後是抽象類實現接口,最後才到具體類實現。

還有,接口可以實現多重繼承而一個類只能繼承一個超類,但可以通過繼承多個接口實現多重繼承,接口還有標識(裡面沒有任何方法,如Remote接口)和數據共享(裡面的變量全是常量)的作用.

說說反射的用途及實現

程序中一般的對象類型都是在編譯期就確定下來的,而Java 反射機制可以動態的創建對象並調用其屬性,這樣對象的類型在編譯期是未知的。所以我們可以通過反射機制直接創建對象即使這個對象在編譯期是未知的,

反射的核心:是 JVM 在運行時 才動態加載的類或調用方法或屬性,他不需要事先(寫代碼的時候或編譯期)知道運行對象是誰。

用途:獲得 Class 對象,判斷是否為某個類的實例

例子

  1. 當我們在使用 IDE(如 Eclipse\IDEA)時,當我們輸入一個隊長或者類並向調用它的屬性和方法時,一按 (“.”)點號,編譯器就會自動列出她的屬性或方法,這裡就會用到反射。

  2. 很多框架(比如 Spring)都是配置化的(比如通過 XML文件配置 JavaBean,Action之類的),為了保證框架的通用性,他們可能根據配置文件加載不同的對象或類,調用不同的方法,這個時候就必須用到反射——運行時動態加載需要加載的對象。

說說 自定義註解的場景及實現

是什麼?

Java註解是附加在代碼中的一些元信息,用於一些工具在編譯、運行時進行解析和使用,起到說明、配置的功能。註解不會也不能影響代碼的實際邏輯,僅僅起到輔助性的作用。

做啥用?

  • 生成文檔。這是最常見的,也是java 最早提供的註解。常用的有@param @return 等

  • 跟蹤代碼依賴性,實現替代配置文件功能。比如Dagger 2依賴注入,未來java開發,將大量註解配置,具有很大用處;

  • 在編譯時進行格式檢查。如@override 放在方法前,如果你這個方法並不是覆蓋了超類方法,則編譯時就能檢查出。.

原理

註解本質是一個繼承了Annotation的特殊接口,其具體實現類是Java運行時生成的動態代理類。而我們通過反射獲取註解時,返回的是Java運行時生成的動態代理對象$Proxy1。通過代理對象調用自定義註解(接口)的方法,會最終調用AnnotationInvocationHandler的invoke方法。該方法會從memberValues這個Map中索引出對應的值。而memberValues的來源是Java常量池。

java.lang.annotation提供了四種元註解,專門註解其他的註解(在自定義註解的時候,需要使用到元註解):

@Documented –註解是否將包含在JavaDoc中

@Retention –什麼時候使用該註解

@Target –註解用於什麼地方

@Inherited – 是否允許子類繼承該註解

自定義註解使用場景

  1. 類屬性自動賦值。

  2. 驗證對象屬性完整性。

  3. 代替配置文件功能,像spring基於註解的配置。

  4. 可以生成文檔,像java代碼註釋中的@see,@param等

HTTP 請求的 GET 與 POST 方式的區別

JAVA面試要點-基本功-精簡答案

session 與 cookie 區別

1,session 在服務器端,cookie 在客戶端(瀏覽器)

2,session 默認被存在在服務器的一個文件裡(不是內存)

3,session 的運行依賴 session id,而 session id 是存在 cookie 中的,也就是說,如果瀏覽器禁用了 cookie ,同時 session 也會失效(但是可以通過其它方式實現,比如在 url 中傳遞 session_id)

4,session 可以放在 文件、數據庫、或內存中都可以。

5,用戶驗證這種場合一般會用 session

session 分佈式處理方式

第一種:粘性session

原理:粘性Session是指將用戶鎖定到某一個服務器上,比如上面說的例子,用戶第一次請求時,負載均衡器將用戶的請求轉發到了A服務器上,如果負載均衡器設置了粘性Session的話,那麼用戶以後的每次請求都會轉發到A服務器上,相當於把用戶和A服務器粘到了一塊,這就是粘性Session機制。

第二種:服務器session複製

原理:任何一個服務器上的session發生改變(增刪改),該節點會把這個 session的所有內容序列化,然後廣播給所有其它節點,不管其他服務器需不需要session,以此來保證Session同步。

第三種:session共享機制

使用分佈式緩存方案比如memcached、Redis,但是要求Memcached或Redis必須是集群。

第四種:session持久化到數據庫

原理:就不用多說了吧,拿出一個數據庫,專門用來存儲session信息。保證session的持久化。

第五種terracotta實現session複製

原理:Terracotta的基本原理是對於集群間共享的數據,當在一個節點發生變化的時候,Terracotta只把變化的部分發送給Terracotta服務器,然後由服務器把它轉發給真正需要這個數據的節點。可以看成是對第二種方案的優化。

JDBC 流程


//第一步:加載Driver類,註冊數據庫驅動

Class.forName(JDBC_DRIVER);

//第二步:通過DriverManager,使用url,用戶名和密碼建立連接(Connection)

connection = DriverManager.getConnection(JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD);

//第三步:通過Connection,使用sql語句打開Statement對象;

preparedStatement = connection.prepareStatement("select * from student where age =?");

//傳入參數,之所以這樣是為了防止sql注入

preparedStatement.setInt(1, 18);

//第四步:執行語句,將結果返回resultSet

resultSet = preparedStatement.executeQuery();

//第五步:對結果進行處理while (resultSet.next()){}

MVC 設計思想

模型層、視圖層、控制層。

JAVA面試要點-基本功-精簡答案

1)模型: 業務邏輯包含了業務數據的加工與處理以及相應的基礎服務(為了保證業務邏輯能夠正常進行的事務、安全、權限、日誌等等的功能模塊)

2)視圖:展現模型處理的結果;另外,還要提供相應的操作界面,方便用戶使用。

3)控制器:視圖發請求給控制器,由控制器來選擇相應的模型來處理;模型返回的結果給控制器,由控制器選擇合適的視圖。

equals 與 == 的區別

1.==是判斷兩個變量或實例是不是指向同一個內存空間

equals是判斷兩個變量或實例所指向的內存空間的值是不是相同

2.==是指對內存地址進行比較

equals()是對字符串的內容進行比較

3.==指引用是否相同

equals()指的是值是否相同

持續未完,關注是資料更新的動力!!


分享到:


相關文章: