牛客java面试题总结版(二)
6.Java中的方法覆蓋(Overriding)和方法重載(Overload)是什么意思?
官方版:Java中的方法重載發生在同一個類里面兩個或者是多個方法的方法名相同但是參數不同的情況。與此相對,方法覆蓋是說子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,參數列表和返回類型。覆蓋者可能不會限制它所覆蓋的方法的訪問。
個人總結:
7.Java中,什么是構造方法?什么是構造方法重載?什么是復制構造方法?
官方版:當新對象被創建的時候,構造方法會被調用。每一個類都有構造方法。在程序員沒有給類提供構造方法的情況下,Java編譯器會為這個類創建一個默認的構造方法。
Java中構造方法重載和方法重載很相似。可以為一個類創建多個構造方法。每一個構造方法必須有它自己唯一的參數列表。
Java不支持像C++中那樣的復制構造方法,這個不同點是因為如果你不自己寫構造方法的情況下,Java不會創建默認的復制構造方法
(所以啊,什么是復制構造方法??)
**注意:**關于Java中的構造函數還要注意:
1.當父類中不寫構造函數時,子類繼承時會默認調用父類的super()方法。一旦在父類中寫了帶參數的構造函數,此時父類的默認構造函數不再調用,程序會報錯,此時,應該在父類中添加一個無參的構造函數。
8.Java支持多繼承么?
官方版:Java中類不支持多繼承,只支持單繼承(即一個類只有一個父類)。 但是java中的接口支持多繼承,,即一個子接口可以有多個父接口。(接口的作用是用來擴展對象的功能,一個子接口繼承多個父接口,說明子接口擴展了多個功能,當類實現接口時,類就擴展了相應的功能)。
大神版:鏈接:
java只支持單繼承,這是由于安全性的考慮,如果子類繼承的多個父類里面有相同的方法或者屬性,子類將不知道具體要繼承哪個,而接口可以多實現,是因為接口只定義方法,而沒有具體的邏輯實現,多實現也要重新實現方法。
9.接口和抽象類的區別是什么?
官方版:Java提供和支持創建抽象類和接口。它們的實現有共同點,不同點在于:
接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
類可以實現很多個接口,但是只能繼承一個抽象類
類可以不實現抽象類和接口聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。
抽象類可以在不提供接口方法實現的情況下實現接口。
Java接口中聲明的變量默認都是final的。抽象類可以包含非final的變量。
Java接口中的成員函數默認是public的。抽象類的成員函數可以是private,protected或者是public。
接口是絕對抽象的,不可以被實例化,抽象類也不可以被實例化。
也可以參考JDK8中抽象類和接口的區別
大神版:從設計層面來說,抽象是對類的抽象,是一種模板設計,接口是行為的抽象,是一種行為的規范。
10.什么是值傳遞和引用傳遞?
官方版:值傳遞是對基本型變量而言的,傳遞的是該變量的一個副本,改變副本不影響原變量.
引用傳遞一般是對于對象型變量而言的,傳遞的是該對象地址的一個副本, 并不是原對象本身 。
一般認為,java內的基礎類型數據傳遞都是值傳遞. java中實例對象的傳遞是引用傳遞
大神版:https://www.zhihu.com/question/31203609/answer/50992895
11.進程和線程的區別是什么?
官方版:進程是執行著的應用程序,而線程是進程內部的一個執行序列。一個進程可以有多個線程。線程又叫做輕量級進程。
線程與進程的區別歸納:
a.地址空間和其它資源:進程間相互獨立,同一進程的各線程間共享。某進程內的線程在其它進程不可見。
b.通信:進程間通信IPC,線程間可以直接讀寫進程數據段(如全局變量)來進行通信——需要進程同步和互斥手段的輔助,以保證數據的一致性。
c.調度和切換:線程上下文切換比進程上下文切換要快得多。
d.在多線程OS中,進程不是一個可執行的實體。
大神版:進程是運行中的程序,線程是進程的內部的一個執行序列
進程是資源分配的單元,線程是執行行單元
進程間切換代價大,線程間切換代價小
進程擁有資源多,線程擁有資源少
多個線程共享進程的資源
12.創建線程有幾種不同的方式?你喜歡哪一種?為什么?
官方版:有4種方式可以用來創建線程:
a.繼承Thread類
b.實現Runnable接口
c.應用程序可以使用Executor框架來創建線程池
d.還有一種方式是實現Callable接口
實現Runnable接口這種方式更受歡迎,因為這不需要繼承Thread類。在應用設計中已經繼承了別的對象的情況下,這需要多繼承(而Java不支持多繼承),只能實現接口。同時,線程池也是非常高效的,很容易實現和使用。
大神版:鏈接:https://www.nowcoder.com/questionTerminal/e33c72bceb4343879948342e2b6e3bca
①繼承Thread類(真正意義上的線程類),是Runnable接口的實現。
②實現Runnable接口,并重寫里面的run方法。
③使用Executor框架創建線程池。Executor框架是juc里提供的線程池的實現。
調用線程的start():啟動此線程;調用相應的run()方法
繼承于Thread類的線程類,可以直接調用start方法啟動線程(使用static也可以實現資源共享).一個線程(對象)只能夠執行一次start(),而且不能通過Thread實現類對象的run()去啟動一個線程。
實現Runnable接口的類需要再次用Thread類包裝后才能調用start方法。(三個Thread對象包裝一個類對象,就實現了資源共享)。
線程的使用的話,注意鎖和同步的使用。(多線程訪問共享資源容易出現線程安全問題)
一般情況下,常見的是第二種。
-
Runnable接口有如下好處:
*①避免點繼承的局限,一個類可以繼承多個接口。
②適合于資源的共享
/ -
Thread的常用方法:
-
1.start():啟動線程并執行相應的run()方法
-
2.run():子線程要執行的代碼放入run()方法中
-
3.currentThread():靜態的,調取當前的線程
-
4.getName():獲取此線程的名字
-
5.setName():設置此線程的名字
-
6.yield():調用此方法的線程釋放當前CPU的執行權(很可能自己再次搶到資源)
-
7.join():在A線程中調用B線程的join()方法,表示:當執行到此方法,A線程停止執行,直至B線程執行完畢,
-
A線程再接著join()之后的代碼執行
-
8.isAlive():判斷當前線程是否還存活
-
9.sleep(long l):顯式的讓當前線程睡眠l毫秒 (只能捕獲異常,因為父類run方法沒有拋異常)
-
10.線程通信(方法在Object類中):wait() notify() notifyAll()
*設置線程的優先級(非絕對,只是相對幾率大些)
- getPriority():返回線程優先值
- setPriority(int newPriority):改變線程的優先級
*/
總結
以上是生活随笔為你收集整理的牛客java面试题总结版(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客java面试题总结版(一)
- 下一篇: 牛客java面试题总结版(三)