java复制的函数会报错,2 面试题之面向对象
大綱:
一、兩個(gè)重要概念
① 請(qǐng)說(shuō)明類和對(duì)象的區(qū)別
類是對(duì)某一類實(shí)物的描述,是抽象的;對(duì)象是一個(gè)實(shí)實(shí)在在的個(gè)體,是類的一個(gè)實(shí)例;
② 解釋一下什么是類加載機(jī)制、雙親委派模型,好處是什么?
類加載機(jī)制:
雙親委派模型:
某個(gè)特定的類加載器在接到加載類的請(qǐng)求時(shí),首先將加載任務(wù)委托給父類加載器,依次遞歸,如果父類加載器可以完成類加載任務(wù),就成功返回;
只有父類加載器無(wú)法完成此加載任務(wù)時(shí),才自己去完成。
好處:
二、java類及類的成員
① 重寫(Overriding)與重載(Overloading)的區(qū)別?
重載:重載指的是同一個(gè)類中的兩個(gè)方法,方法名相同,參數(shù)列表(參數(shù)的類型、個(gè)數(shù)、順序)不同;對(duì)返回值類型沒有要求;
重寫:重寫發(fā)生在子類與父類之間,子類重寫父類的方法,要求與被重寫的方法的參數(shù)列表和返回值相同;
具體不同:
1 重寫與重載都是實(shí)現(xiàn)多態(tài)的方式,區(qū)別在于重載實(shí)現(xiàn)的是編譯時(shí)的多態(tài),重寫實(shí)現(xiàn)的是運(yùn)行時(shí)的多態(tài);(在了解下)
2 重寫后,子類方法的訪問(wèn)修飾權(quán)限不能小于父類的訪問(wèn)修飾權(quán)限;
3 重寫后,子類不能比父類被重寫方法聲明更多的異常;
② 什么是構(gòu)造函數(shù)?什么是構(gòu)造函數(shù)重載?什么是復(fù)制構(gòu)造函數(shù)?
構(gòu)造函數(shù)(構(gòu)造器):
當(dāng)新對(duì)象被創(chuàng)建的時(shí)候,構(gòu)造函數(shù)會(huì)被調(diào)用。每一個(gè)類都有構(gòu)造函數(shù)。在程序中沒有給類提供構(gòu)造函數(shù)的情況下,Java編譯器會(huì)為這個(gè)類創(chuàng)建一個(gè)默認(rèn)的構(gòu)造函數(shù) 。
構(gòu)造函數(shù)重載:
java中構(gòu)造函數(shù)的重載和方法重載很相似。可以為一個(gè)類創(chuàng)建多個(gè)構(gòu)造函數(shù)。每一個(gè)構(gòu)造函數(shù)都必須有他唯一的參數(shù)列表。
復(fù)制構(gòu)造函數(shù):
java不支持像C++中那樣的復(fù)制構(gòu)造函數(shù) , 這個(gè)不同點(diǎn)是因?yàn)槿绻悴蛔约簩憳?gòu)造方法的情況下,Java不會(huì)創(chuàng)建默認(rèn)的復(fù)制構(gòu)造方法。
三、面向?qū)ο蟮娜筇卣?/p>
① 面向?qū)ο蟮奶卣?#xff0c;解釋下?
具體的注意點(diǎn)說(shuō)明:
封裝性:我們可以將類的屬性私有化, 只有通過(guò)公共的get/set方法才能進(jìn)行訪問(wèn),在get/set方法中我們可以對(duì)內(nèi)部邏輯進(jìn)行封裝處理,外部的調(diào)用方不必關(guān)心我們的處理邏輯。
繼承性:
1 java不支持多繼承;
2 類中的構(gòu)造函數(shù)不能被繼承;如果構(gòu)造函數(shù)被private修飾 ,那么該類就不能被其他類繼承;
3 方法的重寫;
多態(tài)性:
1 方法的重載(與重寫);
2 向上轉(zhuǎn)型和向下轉(zhuǎn)型;
參考鏈接:https://www.cnblogs.com/liyanyan665/p/11198602.html
四、java關(guān)鍵字
static關(guān)鍵字:
① 是否可以在static環(huán)境中訪問(wèn)非static變量?
② 解釋一下static關(guān)鍵字,java中是否可以重寫一個(gè)private或者是static的方法?
static關(guān)鍵字:static是表示靜態(tài)的意思,它可用來(lái)修飾成員變量和成員函數(shù),被靜態(tài)修飾的成員函數(shù)只能訪問(wèn)靜態(tài)成員,
不能訪問(wèn)非靜態(tài)成員。靜態(tài)是隨著類的加載而加載,因此可以直接用類進(jìn)行訪問(wèn)。
private或者是static的方法都不能被重寫:
覆蓋,也就是我們常說(shuō)的重寫,是子類繼承父類,且子類中的方法和父類中的方法,方法名、參數(shù)列表和返回值都相同。
private修飾的方法,不能被繼承,所以也不存在重寫(覆蓋);
static修飾的方法,可以被繼承,但不能被重寫。 因?yàn)榉椒ǜ采w是基于運(yùn)行時(shí)動(dòng)態(tài)綁定的,而static方法是編譯時(shí)靜態(tài)綁定的。static方法跟類的任何實(shí)例都不相關(guān),所以概念上不適用。
③ 靜態(tài)與非靜態(tài)的區(qū)別?
這里的靜態(tài),指以static關(guān)鍵字修飾的,包括類,方法,塊,字段。靜態(tài)變量和靜態(tài)方法都屬于靜態(tài)對(duì)象非靜態(tài),指沒有用static 修飾的。
靜態(tài)有一些特點(diǎn):
1.全局唯一,任何一次的修改都是全局性的影響
2.只加載一次,優(yōu)先于非靜態(tài)
3.使用方式上不依賴于實(shí)例對(duì)象。直接用 類名.靜態(tài)方法名? 或者? 類名.靜態(tài)變量名就可引用并且直接可以修改其屬性值,不用get和set方法。
4.生命周期屬于類級(jí)別,從JVM 加載開始到JVM卸載結(jié)束。
5.static final用來(lái)修飾成員變量和成員方法,可簡(jiǎn)單理解為“全局常量”。對(duì)于變量,表示一旦給值就不可修改;對(duì)于方法,表示不可覆蓋。
6.靜態(tài)方法和靜態(tài)變量創(chuàng)建后始終使用同一塊內(nèi)存。
7.靜態(tài)方法優(yōu)點(diǎn)是效率高,缺點(diǎn)是不自動(dòng)進(jìn)行銷毀。
final關(guān)鍵字:
④ 說(shuō)明一下final、finally、finalize的區(qū)別?
final用于聲明屬性,方法和類,分別表示屬性不可交變,方法不可覆蓋,類不可繼承。
finally是異常處理語(yǔ)句結(jié)構(gòu)的一部分,表示總是執(zhí)行。
finalize是Object類的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對(duì)象的此方法,供垃圾收集時(shí)的其他資源回收,例如關(guān)閉文件等。
⑤ 說(shuō)明一下final怎么用的?
五、其他知識(shí)點(diǎn)
① 請(qǐng)列舉你知道的Object類的方法并簡(jiǎn)要說(shuō)明
Object()默認(rèn)構(gòu)造方法。
clone() 創(chuàng)建并返回此對(duì)象的一個(gè)副本。
equals(Object obj) 指示某個(gè)其他對(duì)象是否與此對(duì)象“相等”。
finalize()當(dāng)垃圾回收器確定不存在對(duì)該對(duì)象的更多引用時(shí),由對(duì)象的垃圾回收器調(diào)用此方法。
getClass()返回一個(gè)對(duì)象的運(yùn)行時(shí)類。
hashCode()返回該對(duì)象的哈希碼值。
notify()喚醒在此對(duì)象監(jiān)視器上等待的單個(gè)線程。
notifyAll()喚醒在此對(duì)象監(jiān)視器上等待的所有線程。
toString()返回該對(duì)象的字符串表示。
wait()導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對(duì)象的 notify() 方法或 notifyAll() 方法。
wait(long timeout)導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對(duì)象的 notify() 方法或 notifyAll() 方法,或者超過(guò)指定的時(shí)間量。
wait(long timeout, int nanos) 導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對(duì)象的 notify() 方法或 notifyAll() 方法,或者其他某個(gè)線程中斷當(dāng)前線程,或者已超過(guò)某個(gè)實(shí)際時(shí)間量。
六、抽象類和接口
① 抽象類和接口的區(qū)別?
抽象類:
1 抽象類必須在類前用abstract關(guān)鍵字修飾。如果一個(gè)類中有抽象方法,那么這個(gè)類也是抽象的;
2 子類必須實(shí)現(xiàn)抽象類中的抽象方法,如果有未實(shí)現(xiàn)的,那么子類也是抽象類,必須用 abstract 修飾 ;
3 抽象類默認(rèn)的權(quán)限修飾符為public,可以定義為 public 或 procted,如果定義為 private,那么子類則無(wú)法繼承;
4? 抽象類不能創(chuàng)建對(duì)象, 抽象類就是為了繼承而存在的;
接口( interface ):
1 接口中的變量會(huì)被隱式地指定為public static final變量(并且只能是public static final變量,用private修飾會(huì)報(bào)編譯錯(cuò)誤);
2 接口中的方法會(huì)被隱式地指定為public abstract方法且只能是public abstract方法(用其他關(guān)鍵字,比如private、protected、static、 final等修飾會(huì)報(bào)編譯錯(cuò)誤);
3 接口中所有的方法不能有具體的實(shí)現(xiàn),也就是說(shuō),接口中的方法必須都是抽象方法;
區(qū)別:
1 一個(gè)類只能繼承一個(gè)抽象類,而一個(gè)類卻可以實(shí)現(xiàn)多個(gè)接口;
2 抽象類可以提供成員方法的實(shí)現(xiàn)細(xì)節(jié),而接口中只能存在public abstract 方法;
3 抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型;
4 接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法,而抽象類可以有靜態(tài)代碼塊和靜態(tài)方法;(java 8開始,接口中可以有靜態(tài)方法)
② java是否支持多繼承?
Java中類不支持多繼承,只支持單繼承(即一個(gè)類只有一個(gè)父類)。
但是java中的接口支持多繼承,即一個(gè)子接口可以有多個(gè)父接口。(接口的作用是用來(lái)擴(kuò)展對(duì)象的功能,一個(gè)子接口繼承多個(gè)父接口,說(shuō)明子接口擴(kuò)展了多個(gè)功能,當(dāng)類實(shí)現(xiàn)接口時(shí),類就擴(kuò)展了相應(yīng)的功能)。
總結(jié)
以上是生活随笔為你收集整理的java复制的函数会报错,2 面试题之面向对象的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 赚翻了!2022年12月《王者荣耀》吸金
- 下一篇: pg与oracle区别,Postgres