導(dǎo)語(yǔ)
??Java 面試題集2021版
??is-a表示的是屬于的關(guān)系,也就是說(shuō)馬是屬于動(dòng)物的一種表示的是一種繼承的關(guān)系。
??has-a 表示的是包含的關(guān)系,例如一匹馬有一個(gè)頭,四條腿,等,表示的是關(guān)聯(lián)聚合的一種關(guān)系。
??如果房子里有多個(gè)椅子,就是聚集的關(guān)系,否則則是一種關(guān)聯(lián)關(guān)系也就是一一對(duì)應(yīng)的,椅子與椅子腿應(yīng)該是一種聚合關(guān)系。
??參數(shù)就是用來(lái)代替一個(gè)數(shù)的未知數(shù),參數(shù)表示的就是一符號(hào),沒(méi)有實(shí)際意義,要讓它有實(shí)際的意義,就給對(duì)應(yīng)的參數(shù)賦值就可以。例如定義一個(gè)方法來(lái)計(jì)算兩個(gè)數(shù)字的和,那么該方法就必須要有兩個(gè)參數(shù)來(lái)標(biāo)識(shí)兩個(gè)加數(shù),但是只有當(dāng)調(diào)用該方法時(shí),給該方法的兩個(gè)參數(shù)賦值后才能執(zhí)行該方法,例如int add(int a,int b) 方法,只有調(diào)用的時(shí)候使用具體的數(shù)字代替ab兩個(gè)參數(shù)之后才能執(zhí)行并獲取到最終的結(jié)果。
??參數(shù)化的意義:在數(shù)據(jù)庫(kù)調(diào)用的過(guò)程中,參數(shù)化能有效的防止注入式的攻擊,在程序方法中,參數(shù)化能避免泄漏程序的運(yùn)行機(jī)制與原理,同時(shí)也降低了方法的冗余度,提到代碼的可讀性。
??在之前的問(wèn)題中提到過(guò)override與overload的區(qū)別,對(duì)于override來(lái)說(shuō)就是通過(guò)繼承的方式來(lái)修改某個(gè)類(lèi)的某個(gè)方法,但是構(gòu)造器方法不能被繼承,所以不能被重寫(xiě),但是構(gòu)造器可以通過(guò)參數(shù)列表的不同實(shí)現(xiàn)重載。
??接口是可以繼承接口,抽象類(lèi)可以實(shí)現(xiàn)接口,抽象類(lèi)可以繼承具體的類(lèi)。抽象類(lèi)中可以有main方法。
??只要明白了接口和抽象類(lèi)的本質(zhì)和作用,這些問(wèn)題都是可以分析的,當(dāng)然有一點(diǎn)需要記住,抽象類(lèi)與普通類(lèi)的唯一區(qū)別就是不能創(chuàng)建實(shí)例對(duì)象和允許有abstract方法。
??計(jì)算機(jī)軟件系統(tǒng)是現(xiàn)實(shí)生活的業(yè)務(wù)在計(jì)算機(jī)中的映射,而在現(xiàn)實(shí)生活中的業(yè)務(wù)其實(shí)就是一個(gè)個(gè)對(duì)象協(xié)作的過(guò)程,面向?qū)ο笞兂删褪前磳?shí)現(xiàn)的業(yè)務(wù)一樣的方式將程序代碼按一個(gè)個(gè)對(duì)象進(jìn)行組織和編寫(xiě),為了能上吉斯算計(jì)能夠識(shí)別和理解用對(duì)象的方式組織和編寫(xiě)程序代碼,這樣就可以把現(xiàn)實(shí)生活中的業(yè)務(wù)對(duì)象映射到計(jì)算機(jī)系統(tǒng)中。
??面向?qū)ο蟮木幊陶Z(yǔ)言有繼承、封裝、多態(tài)三個(gè)基本特征。
1、封裝
??封裝是保證軟件部件具有優(yōu)良的模塊性基礎(chǔ),封裝的目標(biāo)就是要實(shí)現(xiàn)軟件部件的“高內(nèi)聚,低耦合”,防止程序相互依賴性帶來(lái)的變動(dòng)影響。在面向?qū)ο蟮木幊陶Z(yǔ)言中,對(duì)象是封裝的基本單位,面向?qū)ο蟮姆庋b比傳統(tǒng)語(yǔ)言的封裝更為清晰,更為有力。面向?qū)ο蟮姆庋b就是把描述一個(gè)對(duì)象的屬性和行為的代碼封裝在一個(gè)模塊中,也就是一個(gè)類(lèi)中,屬性用變量的方式定義,行為用方法的方式進(jìn)行定義,方法可以直接訪問(wèn)同一個(gè)對(duì)象中的屬性。
2、繼承
??在定義和實(shí)現(xiàn)一個(gè)類(lèi)的時(shí)候,可以在一個(gè)已經(jīng)存在的類(lèi)的基礎(chǔ)上來(lái)進(jìn)行,把這個(gè)已經(jīng)存在的類(lèi)所定義的內(nèi)容作為自己的內(nèi)容,并可以加入若干的新內(nèi)容,或者修改原來(lái)的方法使之更適合特殊的需要,這就是繼承。繼承是子類(lèi)自動(dòng)共享父類(lèi)數(shù)據(jù)和方法的機(jī)制,這是兩個(gè)類(lèi)之間的一種關(guān)系,使用這種方式來(lái)實(shí)現(xiàn)的軟件的可重用性和可擴(kuò)展性。
3、多態(tài)
??多態(tài)是指程序中定義的引用變量所指向的具體類(lèi)型和通過(guò)該引用變量發(fā)出的方法調(diào)用在編程的時(shí)候的不確定性,而在程序運(yùn)行的過(guò)程中才能進(jìn)行確定,即一個(gè)引用變量到底會(huì)指向那個(gè)實(shí)力對(duì)象,該引用變量發(fā)出的方法調(diào)用到底是那個(gè)類(lèi)中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定。因?yàn)樵诔绦蜻\(yùn)行的時(shí)候才能產(chǎn)生具體的類(lèi),這樣就可以不用修改源代碼,流可以讓引用變量綁定到各種不同的實(shí)現(xiàn)類(lèi)上,這樣就可以引用到具體的方法上,即不修改程序代碼就可以改變程序運(yùn)行時(shí)所綁定的具體代碼,讓程序可以選擇多個(gè)運(yùn)行狀態(tài),這個(gè)就是多態(tài)性。多態(tài)性增強(qiáng)了軟件的靈活性和擴(kuò)展性。
類(lèi)
1.java.lang.Object
2.java.lang.String
3.java.lang.System
4.java.io.file
5.java.io.FileInputStream
包
1.java.lang
2.java.io
3.java.awt
4.java.util
5.java.sql
接口
1.java.util.List
2.java.util.Map
3.java.util.Iterator
4.java.sql.CallableStatemtent
5.java.lang.Comparable
1、java.lang 包:Java的核心類(lèi)庫(kù),包含了運(yùn)行Java程序必不可少的系統(tǒng)類(lèi),如基本數(shù)據(jù)類(lèi)型,基本數(shù)學(xué)函數(shù),字符串處理、線程、異常處理類(lèi)等等,系統(tǒng)缺省加載這個(gè)包。
2、java.io 包:Java 語(yǔ)言的標(biāo)準(zhǔn)輸入/輸出類(lèi)庫(kù),如基本輸入/輸出流、文件輸入/輸出、過(guò)濾輸出入/輸出流等等
3、java.util包:包含處理時(shí)間date類(lèi),處理編程數(shù)組的Vector類(lèi),以及stack和HashTable類(lèi)
4、java.lang.reflect包:提供用于反射對(duì)象的工具類(lèi)包
5、java.net 包:實(shí)現(xiàn)網(wǎng)絡(luò)功能的類(lèi)庫(kù)有Socket類(lèi)。ServerSocket類(lèi)
6、java.sql 包:提供使用Java編程語(yǔ)言訪問(wèn)并處理存儲(chǔ)在數(shù)據(jù)源(通常是一個(gè)關(guān)系數(shù)據(jù)庫(kù))中的數(shù)據(jù)的API
7、java.awt 包:構(gòu)建圖形用戶界面GUI的類(lèi)庫(kù),低級(jí)繪圖操作Graphics類(lèi),圖形界面組件和布局管理等,例如CheckBox類(lèi)、等,以及界面用戶控制和事件響應(yīng)等等。
??Java中實(shí)現(xiàn)多態(tài)是靠父類(lèi)或者接口定義的引用變量可以指向子類(lèi)或者具體實(shí)現(xiàn)類(lèi)的實(shí)例對(duì)象,而程序調(diào)用方法在運(yùn)行期才動(dòng)態(tài)綁定,就是引用變量所指向的具體實(shí)例對(duì)象的方法,也就是內(nèi)存里正在運(yùn)行的那個(gè)對(duì)象的方法,而不是引用變量的類(lèi)型中定義的方法。
??Java中含有abstract修飾符的class即為抽象類(lèi),abstract類(lèi)不能創(chuàng)建實(shí)例對(duì)象。含有abstract方法的類(lèi)必須定位為abstract class,abstract class 類(lèi)中的方法不必是抽象的。 abstract class類(lèi)中定義抽象方法必須在具體(Concrete)子類(lèi)中實(shí)現(xiàn),所以不能有抽象方法或者抽象靜態(tài)方法。如果子類(lèi)中沒(méi)有實(shí)現(xiàn)父類(lèi)中的抽象方法,那么子類(lèi)必須定義為abstract類(lèi)型。
??接口(interface) 可以說(shuō)成是抽象類(lèi)型的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認(rèn)為public abstract 類(lèi)型,接口中的成員變量類(lèi)型默認(rèn)為public static final 。
??比較兩者的語(yǔ)法區(qū)別:
1、抽象類(lèi)可以有構(gòu)造方法,接口中不能有構(gòu)造方法。
2、抽象類(lèi)中可以有普通成員變量,接口中沒(méi)有普通成員變量
3、抽象類(lèi)中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。
4、抽象類(lèi)中的抽象方法的訪問(wèn)類(lèi)型可以是public ,protected和默認(rèn)作用域,但接口中的抽象方法只能是public類(lèi)型,并且默認(rèn)即為public abstract類(lèi)型。
5、抽象類(lèi)中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法
6、抽象類(lèi)和接口中都可以包含靜態(tài)成員變量,抽象類(lèi)中的靜態(tài)成員變量的訪問(wèn)類(lèi)型可以任意,但接口中定義的變量只能是public static final 類(lèi)型,并且默認(rèn)就是 public static final 類(lèi)型。
7、一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類(lèi)。
??C 虛類(lèi)相當(dāng)于Java中的抽象類(lèi),與接口的不同之處如下
1、一個(gè)子類(lèi)只能繼承一個(gè)抽象類(lèi),但能實(shí)現(xiàn)多個(gè)接口
2、一個(gè)抽象類(lèi)可以有構(gòu)造方法,接口沒(méi)有構(gòu)造方法
3、一個(gè)抽象類(lèi)中的方法不一定是抽象方法,即其中的方法可以有實(shí)現(xiàn),接口中的方法都是抽象方法,不能有方法體,只有方法聲明
4、一個(gè)抽象類(lèi)可以是public、private、protected、default 接口只有public
5、一個(gè)抽象類(lèi)中的方法可以是public、private、protected、default,接口中的方法只能是public和default修飾,實(shí)現(xiàn)上都是public 的abstract方法。
相同之處:都不能進(jìn)行實(shí)例化對(duì)象。
來(lái)源:https://www.icode9.com/content-1-891751.html聯(lián)系客服