java 2017秋招1

1 GC是什么?為什么要有GC?
GC是垃圾收集的意思,內(nèi)存處理是編程人員容易出現(xiàn)問(wèn)題的地方,忘記或者錯(cuò)誤的內(nèi)存回收會(huì)導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java提供的GC功能可以自動(dòng)監(jiān)測(cè)對(duì)象是否超過(guò)作用域從而達(dá)到自動(dòng)回收內(nèi)存的目的,Java語(yǔ)言沒(méi)有提供釋放已分配內(nèi)存的顯示操作方法。

Java程序員不用擔(dān)心內(nèi)存管理,因?yàn)槔占鲿?huì)自動(dòng)進(jìn)行管理。

要請(qǐng)求垃圾收集,可以調(diào)用下面的方法之一:System.gc()或Runtime.getRuntime().gc(),但JVM可以屏蔽掉顯示的垃圾回收調(diào)用。

垃圾回收可以有效的防止內(nèi)存泄露,有效的使用可以使用的內(nèi)存。垃圾回收器通常是作為一個(gè)單獨(dú)的低優(yōu)先級(jí)的線程運(yùn)行,不可預(yù)知的情況下對(duì)內(nèi)存堆中已經(jīng)死亡的或者長(zhǎng)時(shí)間沒(méi)有使用的對(duì)象進(jìn)行清除和回收,程序員不能實(shí)時(shí)的調(diào)用垃圾回收器對(duì)某個(gè)對(duì)象或所有對(duì)象進(jìn)行垃圾回收。

在Java誕生初期,垃圾回收是Java最大的亮點(diǎn)之一,因?yàn)榉?wù)器端的編程需要有效的防止內(nèi)存泄露問(wèn)題,然而時(shí)過(guò)境遷,如今Java的垃圾回收機(jī)制已經(jīng)成為被詬病的東西。移動(dòng)智能終端用戶通常覺(jué)得iOS的系統(tǒng)比Android系統(tǒng)有更好的用戶體驗(yàn),其中一個(gè)深層次的原因就在于android系統(tǒng)中垃圾回收的不可預(yù)知性。

2 簡(jiǎn)述final,finalize,finally的區(qū)別?

  • final:可以作為修飾符修飾變量、方法和類,被final修飾的變量只能一次賦值;被final修飾的方法不能夠在子類中被重寫(override);被final修飾的類不能夠被繼承。

  • finally用在異常處理中定義總是執(zhí)行代碼,無(wú)論try塊中的代碼是否引發(fā)異常,catch是否匹配成功,finally塊中的代碼總是被執(zhí)行,除非JVM被關(guān)閉(System.exit(1)),通常用作釋放外部資源(不會(huì)被垃圾回收器回收的資源)。

  • finalize()方法是Object類中定義的方法,當(dāng)垃圾回收器將無(wú)用對(duì)象從內(nèi)存中清除時(shí),該對(duì)象的finalize()方法被調(diào)用。由于該方法是protected方法,子類可以通過(guò)重寫(override)該方法以整理資源或者執(zhí)行其他的清理工作。

3 Abstract class和interface有什么區(qū)別?

Java語(yǔ)言中,abstract class和interface是支持抽象類定義的兩種機(jī)制。正是由于這兩種機(jī)制的存在,才賦予了Java強(qiáng)大的面向?qū)ο竽芰?。abstract class和interface之間在對(duì)于抽象類定義的支持方面具有很大的相似性,甚至可以相互替換;其實(shí),兩者之間還是有很大的區(qū)別的,有時(shí)對(duì)于它們的選擇甚至反映出對(duì)于問(wèn)題領(lǐng)域本質(zhì)的理解、對(duì)于設(shè)計(jì)意圖的理解是否正確、合理。

Abstract class Interface
實(shí)例化 不能 不能
一種繼承關(guān)系,一個(gè)類只能使用一次繼承關(guān)系??梢酝ㄟ^(guò)繼承多個(gè)接口實(shí)現(xiàn)多重繼承 一個(gè)類可以實(shí)現(xiàn)多個(gè)interface
數(shù)據(jù)成員 可有自己的 靜態(tài)的不能被修改即必須是static final,一般不在此定義
方法 可以私有的,非abstract方法,必須實(shí)現(xiàn) 不可有私有的,默認(rèn)是public,abstract 類型
變量 可有私有的,默認(rèn)是friendly 型,其值可以在子類中重新定義,也可以重新賦值 不可有私有的,默認(rèn)是public static final 型,且必須給其初值,實(shí)現(xiàn)類中不能重新定義,不能改變其值。
設(shè)計(jì)理念 表示的是“is-a”關(guān)系 表示的是“l(fā)ike-a”關(guān)系
實(shí)現(xiàn) 需要繼承,要用extends 要用implements

abstract class和interface在Java語(yǔ)言中都是用來(lái)進(jìn)行抽象類(本文中的抽象類并非從abstract class翻譯而來(lái),它表示的是一個(gè)抽象體,而abstract class為Java語(yǔ)言中用于定義抽象類的一種方法)定義的,那么什么是抽象類,使用抽象類能為我們帶來(lái)什么好處呢?

聲明方法的存在而不去實(shí)現(xiàn)它的類被叫做抽象類(abstract class),它用于要?jiǎng)?chuàng)建一個(gè)體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在該類中實(shí)現(xiàn)該類的情況。不能創(chuàng)建abstract 類的實(shí)例。然而可以創(chuàng)建一個(gè)變量,其類型是一個(gè)抽象類,并讓它指向具體子類的一個(gè)實(shí)例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract 類的子類為它們父類中的所有抽象方法提供實(shí)現(xiàn),否則它們也是抽象類為。取而代之,在子類中實(shí)現(xiàn)該方法。知道其行為的其它類可以在類中實(shí)現(xiàn)這些方法。

接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過(guò)實(shí)現(xiàn) 這樣的接口而獲得。接口中的所有方法都是抽象的,沒(méi)有一個(gè)有程序體。接口只可以定義static final成員變量。接口的實(shí)現(xiàn)與子類相似,除了該實(shí)現(xiàn)類不能從接口定義中繼承行為。當(dāng)類實(shí)現(xiàn)特殊接口時(shí),它定義(即將程序體給予)所有這種接口的方法。 然后,它可以在實(shí)現(xiàn)了該接口的類的任何對(duì)象上調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動(dòng)態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到 接口類型或從接口類型轉(zhuǎn)換,instanceof 運(yùn)算符可以用來(lái)決定某對(duì)象的類是否實(shí)現(xiàn)了接口。

接口可以繼承接口。抽象類可以實(shí)現(xiàn)(implements)接口,抽象類是可以繼承實(shí)體類,但前提是實(shí)體類必須有明確的構(gòu)造函數(shù)。接口更關(guān)注“能實(shí)現(xiàn)什么功能”,而不管“怎么實(shí)現(xiàn)的”。

相同點(diǎn)

  • 兩者都是抽象類,都不能實(shí)例化。
  • interface實(shí)現(xiàn)類及abstrct class的子類都必須要實(shí)現(xiàn)已經(jīng)聲明的抽象方法。

不同點(diǎn)

  • interface需要實(shí)現(xiàn),要用implements,而abstract class需要繼承,要用extends。

  • 一個(gè)類可以實(shí)現(xiàn)多個(gè)interface,但一個(gè)類只能繼承一個(gè)abstract class。

  • interface強(qiáng)調(diào)特定功能的實(shí)現(xiàn),而abstract class強(qiáng)調(diào)所屬關(guān)系。

  • 盡管interface實(shí)現(xiàn)類及abstrct class的子類都必須要實(shí)現(xiàn)相應(yīng)的抽象方法,但實(shí)現(xiàn)的形式不同。interface中的每一個(gè)方法都是抽象方法,都只是聲明的 (declaration, 沒(méi)有方法體),實(shí)現(xiàn)類必須要實(shí)現(xiàn)。而abstract class的子類可以有選擇地實(shí)現(xiàn)。這個(gè)選擇有兩點(diǎn)含義:

    • Abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子類必須實(shí)現(xiàn)。那些沒(méi)有abstract的方法,在Abstrct class中必須定義方法體。
    • abstract class的子類在繼承它時(shí),對(duì)非抽象方法既可以直接繼承,也可以覆蓋;而對(duì)抽象方法,可以選擇實(shí)現(xiàn),也可以通過(guò)再次聲明其方法為抽象的方式,無(wú)需實(shí)現(xiàn),留給其子類來(lái)實(shí)現(xiàn),但此類必須也聲明為抽象類。既是抽象類,當(dāng)然也不能實(shí)例化。
  • abstract class是interface與Class的中介

    • interface是完全抽象的,只能聲明方法,而且只能聲明pulic的方法,不能聲明private及protected的方法,不能定義方法體,也 不能聲明實(shí)例變量。然而,interface卻可以聲明常量變量,并且在JDK中不難找出這種例子。但將常量變量放在interface中違背了其作為接 口的作用而存在的宗旨,也混淆了interface與類的不同價(jià)值。如果的確需要,可以將其放在相應(yīng)的abstract class或Class中。
    • abstract class在interface及Class中起到了承上啟下的作用。一方面,abstract class是抽象的,可以聲明抽象方法,以規(guī)范子類必須實(shí)現(xiàn)的功能;另一方面,它又可以定義缺省的方法體,供子類直接使用或覆蓋。另外,它還可以定義自己 的實(shí)例變量,以供子類通過(guò)繼承來(lái)使用

interface的應(yīng)用場(chǎng)合:

  • 類與類之前需要特定的接口進(jìn)行協(xié)調(diào),而不在乎其如何實(shí)現(xiàn)。
  • 作為能夠?qū)崿F(xiàn)特定功能的標(biāo)識(shí)存在,也可以是什么接口方法都沒(méi)有的純粹標(biāo)識(shí)
  • 需要將一組類視為單一的類,而調(diào)用者只通過(guò)接口來(lái)與這組類發(fā)生聯(lián)系
  • 需要實(shí)現(xiàn)特定的多項(xiàng)功能,而這些功能之間可能完全沒(méi)有任何聯(lián)系

abstract class的應(yīng)用場(chǎng)合:
一句話,在既需要統(tǒng)一的接口,又需要實(shí)例變量或缺省的方法的情況下,就可以使用它。最常見的有:

  • 定義了一組接口,但又不想強(qiáng)迫每個(gè)實(shí)現(xiàn)類都必須實(shí)現(xiàn)所有的接口??梢杂胊bstract class定義一組方法體,甚至可以是空方法體,然后由子類選擇自己所感興趣的方法來(lái)覆蓋
  • 某些場(chǎng)合下,只靠純粹的接口不能滿足類與類之間的協(xié)調(diào),還必需類中表示狀態(tài)的變量來(lái)區(qū)別不同的關(guān)系。abstract的中介作用可以很好地滿足這一點(diǎn)
  • 規(guī)范了一組相互協(xié)調(diào)的方法,其中一些方法是共同的,與狀態(tài)無(wú)關(guān)的,可以共享的,無(wú)需子類分別實(shí)現(xiàn);而另一些方法卻需要各個(gè)子類根據(jù)自己特定的狀態(tài)來(lái)實(shí)現(xiàn)特定的功能

4 Java內(nèi)存管理
(1)請(qǐng)描述java的內(nèi)存管理原理
(2)請(qǐng)描述java的內(nèi)存分區(qū)
(3)請(qǐng)描述java的對(duì)象生命周期,以及對(duì)象的訪問(wèn)?
暫時(shí)參考:
Java內(nèi)存管理原理及內(nèi)存區(qū)域詳解

java內(nèi)存管理深入淺出

Java內(nèi)存管理:深入Java內(nèi)存區(qū)域

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,626評(píng)論 18 399
  • (一)Java部分 1、列舉出JAVA中6個(gè)比較常用的包【天威誠(chéng)信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,241評(píng)論 0 62
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,800評(píng)論 0 11
  • 小編費(fèi)力收集:給你想要的面試集合 1.C++或Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 5,172評(píng)論 1 114
  • 猴子是階層性的社會(huì),猴王可以任意毆打小猴子,使小猴子每天生活在水深火熱之中,動(dòng)輒得咎。實(shí)驗(yàn)者把剛出生的小猴子與猴王...
    浪漫夏日閱讀 195評(píng)論 0 0

友情鏈接更多精彩內(nèi)容