如何面試java工程師(一)
1、 類、對象的概念:
1) 類:具有共同屬性和行為的對象的抽象。類是創建對象的模板。
2) 對象:現實世界中的實體。在計算機中,是指可標識的存儲區域。
3) 類是對象的抽象、對象是類的實例。
2、 抽象:是從特定的實例中抽取共同性質形成一般化概念的過程。
3、 接口與抽象類:
1)接口和抽象類都用於抽象,接口是抽象類的抽象。
2)接口中只有方法聲明,沒有實現(無方法體);在接口中聲明的方法具有public和abstract屬性,一個類可以實現多個接口(即多繼承),接口以‘,’分隔;接口中的方法必須全部實現。
3)抽象類可以有部分方法實現,抽象類必須通過繼承才能使用。
4、內部類(inner class):
1)內部類是嵌套在另一個類中的類。
2)內部類用於名稱隱藏和程式代碼的組織,另外內部類擁有直接訪問其外部類所有成員(包括private的)的許可權(無需任何關鍵字修飾)。
3)內部類不可以在其他類或main方法裡實例化,必須使用如下方法(非靜態內部類)
外部類.內部類 對象名=new 外部類().new 內部類();
靜態內部類調用方式:
外部類.內部類 對象名=new 外部類.內部類();
4)非靜態內部類不可以聲明靜態成員;靜態內部類的非靜態成員可以訪問其外部類的靜態成員,聲明為靜態的成員不可以訪問外部的非靜態成員。
5、訪問修飾符限制:
private protected friendly(default) public
同類 y y y y
同包不同類 n y y y
同包子類 n y y y
不同包不同類 n n n y
不同包子類 n y n y
6、static關鍵字的使用:
1)類成員,直接使用 類名.成員 調用。
2)靜態方法只能訪問靜態成員。
3)靜態方法不能使用this、super關鍵字。
4)靜態方法不能被非靜態方法重寫或重載。
7、final關鍵字:
1)被final修飾的變數為常量不能改變。
2)被final修飾的方法不可以重寫。
3)被final修飾的類不能被繼承。
8、abstract關鍵字:
1)被abstract修飾的類不能實例化。
2)被abstract修飾的方法只能在子類中實現。
9、native關鍵字:非java語言的編寫,例如jni技術。
10、synchronized關鍵字:多執行緒的同步訪問控制。
11、分類列舉伺服器和組件技術:
1)伺服器端技術:jsp、servlet;
2)組件技術:javabean、ejb。
12、http與https:https即多了安全的http,s(security socket layer)指加密套接字協定層(簡寫ssl)。
13、osi(open system interconnection)網路抽象模型:
1)由國際標準化組織(iso)提出。
2)將網際網路分為七層,從下至上分別為:物理層(physical)、數據鏈路層(data link)、網路層(network)、傳送層(transport)、會話層(session)、表示層(presentation)、套用層(application)。底層通過提供接口支持上層功能。各層詳解:
物理層:lan/atm,為硬體層。
數據鏈路層:lan/atm
網路層:ip協定,ios
傳輸層:tcp/udp協定,支持java socket。
會話層:
表示層:html、xml
套用層:http協定,使用java servlet/jsp
<第八層(web服務層):soap/uddi>
14、j2ee的容器與伺服器:
容器負責ejb組件中生命周期的控制;
伺服器包含在容器外,提供系統級操作底層服務,包括事務、事件、多執行緒……。
15、繼承限制:
父類對象不可以賦給子類對象,因為子類可能具有更多的成員,反之可以。
16、邏輯操作:c=(a>b)?a:b;等同於下式
if(a>b) c=a; else c=b;
如何面試java工程師(二)
17、列舉常見集合框架類型:
1)list、set、map。由這三個接口實現出arraylist、linkedlist、hashset、treeset、hashmap、treemap等常用集合框架。
2)vector屬於重量級組件不推薦使用。
3)map類型維護鍵/值對,hashtable與hashmap相近但效率略低於hashmap、高於treemap,treemap優點是可以排序。
4)set類型可裝入唯一值,hashset效率高於treeset但treeset可以維護內部元素的排序狀態。
5)list類型可按某種特定順序維護元素。arraylist允許快速隨機訪問,但如果添加或刪除位於中間的元素時效率很低;likedlist提供最佳循序訪問及快速的中間位置添加刪除元素,並有addfirst、addlast、getfirst、getlast、removefirst、removelast方法。
18、面向對象的特徵:
1)繼承:通過子類可以實現繼承,子類繼承父類的所有狀態和行為,同時添加自身的狀態和行為。
2)封裝:將代碼及處理數據綁定在一起的一種編程機制,該機制保證程式和數據不受外部干擾。
3)多態:包括重載和重寫。重載為編譯時多態,重寫是運行時多態。重載必須是同類中名稱相同參數不同(包括個數不同和類型不同),但返回類型不同不構成重載;重寫發生於子類對父類的覆蓋,子類繼承父類方法名相同、參數列表相同、返回類型相同才構成重寫。
19、java命名規範:必須以英文字母、下劃線(’_’)或’$’開始,其餘可以有數字但不允許 包含空格,且組合後的名稱不能是java關鍵字或保留字。
匈牙利命名法:以m開始為類成員變數,以g開始為全局變數,以v開始為本地局部變數,常量命名一般不以下劃線、美元符開始。
駝峰命名:一般稱由多個單詞或縮寫組成的變數名,並且該變數名每個單詞首字母均為大寫(一般類名全部首字母大寫,方法或屬性名第一個字母小寫)的稱為駝峰命名。
20、java語言共包含47個關鍵字。
21、設計模式:
一個設計模式描述了一個被證實可行的方案。這些方案非常普遍,是具有完整定義的最常用的模式。一般模式有4個基本要素:模式名稱(pattern name)、問題(problem)、解決方案(solution)、效果(consequences)。
常見23種模式概述:
1) 抽象工廠模式(abstract factory):提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
2) 適配器模式(adapter):將一個類的接口轉換成客戶希望的另外一個接口。適配器模式使得原本由於接口不兼容而不能一起工作的類可以一起工作。
3) 橋樑模式(bridge):將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
4) 建造模式(builder):將一個複雜對象的構建與它的表示分離,使同樣的構建過程可以創建不同的表示。
5) 責任鏈模式(chain of responsibility):為解除請求的傳送者和接收者之間耦合,而使多個對象都有機會處理這個請求。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它。
6) 命令模式(command):將一個請求封裝為一個對象,從而可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可取消的操作。
7) 合成模式(composite):將對象組合成樹形結構以表示“部分-整體”的層次結構。它使得客戶對單個對象和複合對象的使用具有一致性。
8) 裝飾模式(decorator):動態地給一個對象添加一些額外的職責。就擴展功能而言,它能生成子類的方式更為靈活。
9) 門面模式(facade):為子系統中的一組接口提供一個一致的界面,門面模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
10) 工廠方法(factory method):定義一個用於創建對象的接口,讓子類決定將哪一個類實例化。factory method 使一個類的實例化延遲到其子類。
11) 享元模式(flyweight):運用共享技術以有效地支持大量細粒度的對象。
12) 解釋器模式(interpreter):給定一個語言,定義它的語法的一種表示,並定義一個解釋器,該解釋器使用該表示解釋語言中的句子。
13) 疊代子模式(iterator):提供一種方法順序訪問一個聚合對象中的各個元素,而又不需暴露該對象的內部表示。
14) 調停者模式(mediator):用一個中介對象來封裝一系列的對象互動。中介者使各對象不需要顯式的內部表示。
15) 備忘錄模式(memento):在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到保存的狀態。
16) 觀察者模式(observer):定義對象間的一種一對多的依賴關係,以便當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並自動刷新。
17) 原始模型模式(prototype):用原型實例指定創建對象的種類,並且通過拷貝這個原型創建新的對象。
18) 代理模式(proxy):為其他對象提供一個代理以控制對這個對象的訪問。
19) 單例模式(singleton):保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
20) 狀態模式(state):允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它所屬的類。
21) 策略模式(strategy):定義一系列的算法,把它們一個個封裝起來,並且使它們可相互替換。本模式使得算法的變化可獨立於使用它的客戶。
22) 模板模式(template method):定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
23) 訪問者模式(visitor):表示一個作用於某對象結構中的各元素的操作。該模式可以實現在不改變各元素的類的前提下定義作用於這些元素的新操作。
1、 你認為一個項目如何進行才正確?(比如:盡一切可能快的完成任務或完全按照類似cmm來操作)
根據林銳博士的觀點:企業的根本目標是合法地賺取儘可能多的利潤,使企業利益最大化。企業所有的特定目標和行動都是圍繞上述根本目標開展的,任何背離根本目標的行動都將對企業造成傷害,應當杜絕。
基於此任何人都不要強調我將嚴格遵守xx模式,帶領團隊開發出具有xx等級的產品,企業需要的是能夠帶領團隊按時、合格的開發出產品的manager。
2、 你經常看或仔細研讀過的書有哪些?
不用回答你看過的課本,枚舉幾個經典的當然前提是必須真的看過至少瀏覽過主題和目錄。比如《java編程思想》、《java模式》、《人月神話》等,由於將來要做的是team中的替補leader或真正的leader所以你必須說出軟工的東西。
3、 你認為你應聘我們公司的項目經理,你自身的優勢在哪?
1)融洽,沒有領導希望你帶領團隊每天打嘴仗然後他還要去開屁股(sorry,這似乎不很文明),你必須說明你能在以往團隊中與其他人和諧相處。
2)技術,千萬不要謙虛,對方要的就是技術過硬、能力出眾的人才,你只需要說明你成功解決過什麼難題並且你對j2ee、xx中間件、xx系統有多么的熟悉。
4、 如果給你一個team,公司決定讓你的team開發a產品,ok這恰好是你的強項,你們很快開發出來了,但很沮喪的結果是它(你們的產品)沒有銷路;經過討論公司又決定讓你的team開發b產品,ok這恰好又是你的強項,你們很快開發出來了,但很沮喪的結果是它(你們的產品)又沒有銷路。請問你怎么面對這個問題,你是否覺得決策層很無能甚至要推翻他或者去一個更有前途的公司?
不要以為這個故事很單純,這應該是人力在考核你。你一定要告訴她(人力多半是女的),我個人對於失敗的項目肯定會難過(是的,我想了很久才想出“難過”這個詞,它很中性),不過我認為這恰恰認證了公司在革新和新技術探索方面的魄力(自己想怎么說,如果天下人都說這句那才是悲劇呢),我肯定會以個人的名義向領導層提出我自己的建議和看法當然它未必正確,我不會離開公司,因為有點小挫折未嘗不是好事。(你應該在這個問題上好好想想,儘量發揮到10分鐘)
5、 你認為項目中最重要的是哪些過程?
分析、設計階段(也可以加上測試,但千萬別說編碼或開發階段),根據《人月神話》的觀點:1/3 計畫;1/6 編碼;1/4 構件測試和早期系統測試;1/4 系統測試,所有的構件已完成
但根據國內目前的狀況一般公司不會有很多的分析與設計時間(這取決於公司規模和時間成本),這樣在一個工期很緊張的項目中我們應該儘量分配出進度優先權來,首先拿出客戶最希望看到的和最能證明成果的東西來,其他的留待2期甚至3期去作,你可以告訴客戶需要進一步調試(專業人員的欺騙手段,實際上就是在進行後續的開發)。
6、 如果給你一個4-6個人的team,那么你怎么分配他們、管理他們?
管理能力和經驗的綜合題,可能沒有人有相同的觀點,那你可以按照某些思路來側面解答:我會挑選一個技術過硬的人作為我的替補和項目的輕騎兵,是的團隊中必須有機動人員,否則你的項目十有八九會夭折。其他的人會被平均的分配任務。
我們會在每周進行全面的任務分配,每個人獲取一周的大概工作,然後每天的工作由他自己完成並匯報。(很好,如果答出這些就差不多了,多說可能會出現漏洞)
7、 簡述常用的軟體開發文檔。
1) 可行性研究報告(某些公司或模型沒有)
2) 項目開發計畫
3) 軟體需求說明書(必有)
4) 數據要求說明書
5) 概要設計說明書(必有)
6) 詳細設計說明書(必有)
7) 資料庫設計說明書(必有)
8) 用戶手冊(一般會有)
9) 操作手冊(必有)
10) 模組開發卷宗
11) 測試計畫(必有)
12) 測試分析報告
13) 開發進度月報
14) 項目開發總結報告
8、 簡述類的關係。
1) 當一個類是“一種”另一個類時:is-a關係
2) 當兩個類之間有關聯時:
一個類“包含”另一個類:has-a關係
一個類“使用”另一個類
還可以細分有聚合和組合(uml寶典)或聚集和組成(包括國內某些知名學術團體都這么說)。
聚集(aggregation)表示整體與各部分之間的關係。例如汽車與輪胎,沒有了汽車輪胎依然是一個整體。(用空心菱形表示)
組成是一種整體和部分所屬更強的聚集關係,每個部分只能屬於一個整體,沒有整體部分也就沒有存在的價值。比如桌子和桌腿,沒有桌子也就沒有桌腿的價值了。(用實心菱形表示)