java 多态判断非空_跳槽涨薪季面试题之java基础(一)
點擊上方[全棧開發(fā)者社區(qū)]→右上角[...]→[設為星標?]
為迎接金九銀十跳槽漲薪季,小編匯總了java精編版面試題,大概從java基礎、java8特性、多線程、spring、springboot、springcloud、springmvc、jvm虛擬機、mybatis、數據庫、數據結構、設計模式、redis、nginx、大數據面試題、dubbo和zookeeper、RabbitMQ、RocketMQ、solr和ES以及junit和shiro等技術面試題,大概兩周時間,每天一篇,看完如果掌握50%,跳槽漲50%沒問題!
1.面向對象的三個特征
封裝,繼承,多態(tài),抽象,詳細自己看。
2.什么是面向對象?
面向對象程序設計是以建立模型體現(xiàn)出來的抽象思維過程和面向對象的方法。我們可以將某個事物抽象出來,賦予它自己的特征,并且可以針對這個事物進行相應的操作,以及規(guī)定與其他對象之間的關系。可以降低代碼的耦合度,使程序更加靈活。
3.多態(tài)的好處
允許不同類對象對同一消息做出響應,即同一消息可以根據發(fā)送對象的不同而采用多種不同的行為方式(發(fā)送消息就是函數調用)。即父類型的引用指向子類型的對象。主要有以下優(yōu)點:
可替換性:多態(tài)對已存在代碼具有可替換性
可擴充性:增加新的子類不影響已經存在的類結構
更加靈活
4.面向對象和面向過程的區(qū)別?
面向過程
優(yōu)點:性能比面向對象高,因為類調用時需要實例化,開銷比較大,比較消耗資源。比如,單片機、嵌入式開發(fā)、Linux/Unix 等一般采用面向過程開發(fā),性能是最重要的因素。
缺點:沒有面向對象易維護、易復用、易擴展。
面向對象
優(yōu)點:易維護、易復用、易擴展,由于面向對象有封裝、繼承、多態(tài)性的特性,可以設計出低耦合的系統(tǒng),使系統(tǒng)更加靈活、更加易于維護。
缺點:性能比面向過程低。
5.什么是值傳遞和引用傳遞?
值傳遞,是對基本型變量而言的,傳遞的是該變量的一個副本,改變副本不影響原變量。
引用傳遞,一般是對于對象型變量而言的,傳遞的是該對象地址的一個副本,并不是原對象本身。
一般認為,Java 內的傳遞都是值傳遞,Java 中實例對象的傳遞是引用傳遞。
6.代碼中如何實現(xiàn)多態(tài)
實現(xiàn)多態(tài)主要有以下三種方式:
1. 接口實現(xiàn)
2. 繼承父類重寫方法
3. 同一類中進行方法重載
7.接口的意義
規(guī)范,擴展,回調。
8.抽象類的意義
為其他子類提供一個公共的類型
封裝子類中重復定義的內容
定義抽象方法,子類雖然有不同的實現(xiàn),但是定義時一致的
9.接口和抽象類的區(qū)別
10.父類的靜態(tài)方法能否被子類重寫
不能。重寫只適用于實例方法,不能用于靜態(tài)方法,而子類當中含有和父類相同簽名的靜態(tài)方法,我們一般稱之為隱藏。
11.什么是不可變對象
不可變對象指對象一旦被創(chuàng)建,狀態(tài)就不能再改變。任何修改都會創(chuàng)建一個新的對象,如 String、Integer及其它包裝類。
12.靜態(tài)變量和實例變量的區(qū)別?
靜態(tài)變量存儲在方法區(qū),屬于類所有。實例變量存儲在堆當中,其引用存在當前線程棧。
13.能否創(chuàng)建一個包含可變對象的不可變對象?
當然可以創(chuàng)建一個包含可變對象的不可變對象的,你只需要謹慎一點,不要共享可變對象的引用就可以了,如果需要變化時,就返回原對象的一個拷貝。最常見的例子就是對象中包含一個日期對象的引用。
14.java 創(chuàng)建對象的幾種方式
采用new
通過反射
采用clone
通過序列化機制
前2者都需要顯式地調用構造方法。造成耦合性最高的恰好是第一種,因此你發(fā)現(xiàn)無論什么框架,只要涉及到解耦必先減少new的使用
15.Java訪問修飾符的作用域
16.switch中能否使用string做參數
在idk 1.7之前,switch只能支持byte, short, char, int或者其對應的封裝類以及Enum類型。從idk 1.7之后switch開始支持String。
17.switch能否作用在byte, long上?
可以用在byte上,但是不能用在long上。
在switch(expr1)中,expr1只能是一個整數表達式或者枚舉常量,整數表達式可以是int基本類型或Integer包裝類型,由于,byte,short,char都可以隱含轉換為int,所以,這些類型以及這些類型的包裝類型也是可以的。顯然,long和String類型都不符合sitch的語法規(guī)定,并且不能被隱式轉換成int類型,所以,它們不能作用于swtich語句中。
18.String s1=”ab”, String s2=”a”+”b”, String s3=”a”, String s4=”b”, s5=s3+s4請問s5==s2返回什么?
返回false。在編譯過程中,編譯器會將s2直接優(yōu)化為”ab”,會將其放置在常量池當中,s5則是被創(chuàng)建在堆區(qū),相當于s5=new String(“ab”);
19.java當中的四種引用
強引用,軟引用,弱引用,虛引用。不同的引用類型主要體現(xiàn)在GC上:
強引用:如果一個對象具有強引用,它就不會被垃圾回收器回收。即使當前內存空間不足,JVM也不會回收它,而是拋出 OutOfMemoryError 錯誤,使程序異常終止。如果想中斷強引用和某個對象之間的關聯(lián),可以顯式地將引用賦值為null,這樣一來的話,JVM在合適的時間就會回收該對象。
軟引用:在使用軟引用時,如果內存的空間足夠,軟引用就能繼續(xù)被使用,而不會被垃圾回收器回收,只有在內存不足時,軟引用才會被垃圾回收器回收。
弱引用:具有弱引用的對象擁有的生命周期更短暫。因為當 JVM 進行垃圾回收,一旦發(fā)現(xiàn)弱引用對象,無論當前內存空間是否充足,都會將弱引用回收。不過由于垃圾回收器是一個優(yōu)先級較低的線程,所以并不一定能迅速發(fā)現(xiàn)弱引用對象。
虛引用:顧名思義,就是形同虛設,如果一個對象僅持有虛引用,那么它相當于沒有引用,在任何時候都可能被垃圾回收器回收。
20.為什么要有不同的引用類型
在Java中有時候我們需要適當的控制對象被回收的時機,因此就誕生了不同的引用類型,可以說不同的引用類型實則是對GC回收時機不可控的妥協(xié)。有以下幾個使用場景可以充分的說明:
利用軟引用和弱引用解決OOM問題:用一個HashMap來保存圖片的路徑和相應圖片對象關聯(lián)的軟引用之間的映射關系,在內存不足時,JVM會自動回收這些緩存圖片對象所占用的空間,從而有效地避免了OOM的問題。
21.equals()和hashcode()的聯(lián)系
hashCode()是Object類的一個方法,返回一個哈希值。如果兩個對象根據equal()方法比較相等,那么調用這兩個對象中任意一個對象的hashCode()方法必須產生相同的哈希值。
如果兩個對象根據eqaul()方法比較不相等,那么產生的哈希值不一定相等。
a.hashCode()有什么用?
將對象放入到集合中時,首先判斷要放入對象的hashcode是否已經在集合中存在,不存在則直接放入集合。如果hashcode相等,然后通過equal()方法判斷要放入對象與集合中的任意對象是否相等:如果equal()判斷不相等,直接將該元素放入集合中,否則不放入。
有沒有可能兩個不相等的對象有相同的hashcode
有可能,兩個不相等的對象可能會有相同的 hashcode 值,這就是為什么在 hashmap 中會有沖突。如果兩個對象相等,必須有相同的hashcode 值,反之不成立。
可以在hashcode中使用隨機數字嗎?
不行,因為同一對象的 hashcode 值必須是相同的
a==b與a.equals(b)有什么區(qū)別
如果a 和b 都是對象,則 a==b 是比較兩個對象的引用,只有當 a 和 b 指向的是堆中的同一個對象才會返回 true,而 a.equals(b) 是進行邏輯比較,所以通常需要重寫該方法來提供邏輯一致性的比較。例如,String 類重寫 equals() 方法,所以可以用于兩個不同對象,但是包含的字母相同的比較。
基本類型比較用==,比較的是他們的值。默認下,對象用==比較時,比較的是內存地址,如果需要比較對象內容,需要重寫equal方法。
22.什么是自動拆裝箱?
自動裝箱和拆箱,就是基本類型和引用類型之間的轉換。
把基本數據類型轉換成包裝類的過程就是打包裝,為裝箱。
把包裝類轉換成基本數據類型的過程就是拆包裝,為拆箱。
23.為什么要轉換?
如果你在 Java5 下進行過編程的話,你一定不會陌生這一點,你不能直接地向集合( Collection )中放入原始類型值,因為集合只接收對象。
通常這種情況下你的做法是,將這些原始類型的值轉換成對象,然后將這些轉換的對象放入集合中。使用 Integer、Double、Boolean 等這些類,我們可以將原始類型值轉換成對應的對象,但是從某些程度可能使得代碼不是那么簡潔精煉。
為了讓代碼簡練,Java5 引入了具有在原始類型和對象類型自動轉換的裝箱和拆箱機制。
但是自動裝箱和拆箱并非完美,在使用時需要有一些注意事項,如果沒有搞明白自動裝箱和拆箱,可能會引起難以察覺的 Bug 。
24.Overload和Override的區(qū)別。Overloaded的方法是否可以改變返回值的類型
答:方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading是一個類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。
25.int 和 Integer 有什么區(qū)別
答:Java 提供兩種不同的類型:引用類型和原始類型(或內置類型)。Int是java的原始數據類型,Integer是java為int提供的封裝類。Java為每個原始類型提供了封裝類。引用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問題,這種類型以哪種類型的數據結構存儲,當引用類型和原始類型用作某個類的實例數據時所指定的缺省值。對象引用實例變量的缺省值為 null,而原始類型實例變量的缺省值與它們的類型有關。
26.& 和 &&的區(qū)別
&運算符有兩種用法:(1)按位與;(2)邏輯與。&&運算符是短路與運算。邏輯與跟短路與的差別是非常巨大的,雖然二者都要求運算符左右兩端的布爾值都是true整個表達式的值才是true。&&之所以稱為短路運算是因為,如果&&左邊的表達式的值是false,右邊的表達式會被直接短路掉,不會進行運算。很多時候我們可能都需要用&&而不是&,例如在驗證用戶登錄時判定用戶名不是null而且不是空字符串,應當寫為:username != null &&!username.equals(“”),二者的順序不能交換,更不能用&運算符,因為第一個條件如果不成立,根本不能進行字符串的equals比較,否則會產生NullPointerException異常。注意:邏輯或運算符(|)和短路或運算符(||)的差別也是如此。
27.final有哪些用法
final也是很多面試喜歡問的地方,能回答下以下三點就不錯了:
1.被final修飾的類不可以被繼承
2.被final修飾的方法不可以被重寫
3.被final修飾的變量不可以被改變。如果修飾引用,那么表示引用不可變,引用指向的內容可變。
4.被final修飾的方法,JVM會嘗試將其內聯(lián),以提高運行效率
5.被final修飾的常量,在編譯階段會存入常量池中。
回答出編譯器對final域要遵守的兩個重排序規(guī)則更好:
1.在構造函數內對一個final域的寫入,與隨后把這個被構造對象的引用賦值給一個引用變量,這兩個操作之間不能重排序。
2.初次讀一個包含final域的對象的引用,與隨后初次讀這個final域,這兩個操作之間不能重排序。
28.final、finalize 和 finally 的不同之處?
final 是一個修飾符,可以修飾變量、方法和類。如果 final 修飾變量,意味著該變量的值在初始化后不能被改變。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的,但是什么時候調用 finalize 沒有保證。finally 是一個關鍵字,與 try 和 catch 一起用于異常的處理。finally 塊一定會被執(zhí)行,無論在 try 塊中是否有發(fā)生異常。
29.Java集合框架是什么?說出一些集合框架的優(yōu)點?
集合框架的部分優(yōu)點如下:
(1)使用核心集合類降低開發(fā)成本,而非實現(xiàn)我們自己的集合類。
(2)隨著使用經過嚴格測試的集合框架類,代碼質量會得到提高。
(3)通過使用JDK附帶的集合類,可以降低代碼維護成本。
(4)復用性和可操作性。
30.Java集合框架的基礎接口有哪些?
Set是一個不能包含重復元素的集合。這個接口對數學集合抽象進行建模,被用來代表集合,就如一副牌。
List是一個有序集合,可以包含重復元素。你可以通過它的索引來訪問任何元素。List更像長度動態(tài)變換的數組。
Map是一個將key映射到value的對象.一個Map不能包含重復的key:每個key最多只能映射一個value。
一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。
點擊鏈接領資料:金九銀十面試季來臨,最新BATJ面試資料分享給你
留言打卡35天。
覺得本文對你有幫助?請分享給更多人
關注「全棧開發(fā)者社區(qū)」加星標,提升全棧技能
本公眾號會不定期給大家發(fā)福利,包括送書、學習資源等,敬請期待吧!
如果感覺推送內容不錯,不妨右下角點個在看轉發(fā)朋友圈或收藏,感謝支持。
好文章,我在看??
總結
以上是生活随笔為你收集整理的java 多态判断非空_跳槽涨薪季面试题之java基础(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springcloud 并发_Sprin
- 下一篇: 修改表格字体颜色_CAD表格文字样式失灵