(一)面向?qū)ο蠛兔嫦蜻^程的區(qū)別
一、編程思想不同。
1、面向過程:是一種以過程為中心的編程思想。都是以什么正在發(fā)生為主要目標(biāo)進(jìn)行編程。
2、面向?qū)ο笳Z言:是一類以對象作為基本程序結(jié)構(gòu)單位的程序設(shè)計語言,指用于描述的設(shè)計是以對象為核心,而對象是程序運(yùn)行時刻的基本成分。
二、特點(diǎn)不同。
1、面向過程:就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn),使用的時候一個一個依次調(diào)用就可以了。
2、面向?qū)ο笳Z言:識認(rèn)性,系統(tǒng)中的基本構(gòu)件可識認(rèn)為一組可識別的離散對象,對象具有唯一的靜態(tài)類型和多個可能的動態(tài)類型,在基本層次關(guān)系的不同類中共享數(shù)據(jù)和操作。
三、優(yōu)勢不同。
1、面向過程:不支持豐富的“面向?qū)ο蟆碧匦裕ū热缋^承、多態(tài)),并且不允許混合持久化狀態(tài)和域邏輯。
2、面向?qū)ο笳Z言:在內(nèi)部被表示為一個指向一組屬性的指針。任何對這個對象的操作都會經(jīng)過這個指針操作對象的屬性和方法。
(二)Java的四個基本特征(抽象、封裝、繼承,多態(tài))
1. 抽象:抽象是將類的共同特征總結(jié)出來構(gòu)造類的過程,包括數(shù)據(jù)抽象和行為抽象兩方面,抽象只關(guān)注對象有哪些屬性和行為,并不關(guān)注這些行為的細(xì)節(jié)是什么。
2. 繼承:繼承是從已有類抽取繼承信息并構(gòu)建新的類的過程,提供繼承信息的被稱為父類(超類/基類),獲取繼承信息的被稱為子類(派生類)。繼承它讓變化中的軟件系統(tǒng)有了一定的延續(xù)性,同時繼承也是封裝過程中可變因素的重要手段。
3. 封裝:通常認(rèn)為封裝就是把數(shù)據(jù)和操作數(shù)據(jù)的方法綁定起來,對數(shù)據(jù)的訪問只能通過已定義的接口。面向?qū)ο蟮谋举|(zhì)就是將現(xiàn)實(shí)世界描繪成一系列完全自治、封閉的對象。我們在類中編寫的方法就是對實(shí)現(xiàn)細(xì)節(jié)的一種封裝;我們編寫類就是對數(shù)據(jù)和數(shù)據(jù)操作的封裝。簡單來說就是封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程接口。
4. 多態(tài)性:不同子類型的對象對同一消息做出的不同的響應(yīng)。
(三)重載和重寫的區(qū)別
1.重寫必須繼承,重載不用。
2.重寫的方法名,參數(shù)數(shù)目相同,參數(shù)類型兼容,重載的方法名相同,參數(shù)列表不同
3.重寫的方法修飾符大于等于父類的方法,重載和修飾符無關(guān)。
4.重寫不可以拋出父類沒有拋出的一般異常,可以拋出運(yùn)行時異常。
(四)構(gòu)造器Constructor是否可以被override?
構(gòu)造器(override)不能被繼承,因此不能重寫overriding,但是可以被重載overloading。constructor,說簡單點(diǎn)就是“構(gòu)造方法”。構(gòu)造方法的作用就是“為對象的初始化賦值”。在java或c#中如果不聲明構(gòu)造方法的話,則系統(tǒng)會自動提供一個不帶任何參數(shù)的構(gòu)造方法。舉例來說:student stu1= new student();其中的student()就叫做構(gòu)造方法,是不帶參數(shù)的構(gòu)造方法。在比如:student stu2 = new student("張三",18);這個student("張三",18)就是構(gòu)造方法,是帶參數(shù)的構(gòu)造方法。構(gòu)造方法怎么聲明:舉個例子:無參數(shù):public student(){ }有參數(shù)public student(string name,int age){ this.name=name; this.age=age;}至于構(gòu)造方法為什么不能override?override是方法“重寫”,而構(gòu)造方法不能重寫,只能“重載”。
(五)訪問控制符public private protected以及默認(rèn)的區(qū)別
1.public:public修飾的數(shù)據(jù)成員和成員函數(shù)是公開的,所有的用戶都可以進(jìn)行調(diào)用。
2.private:private修飾詞修飾的成員變量以及成員方法只供本類使用,也就是私有的,其他用戶是不可調(diào)用的。
3.protected:protected修飾詞修飾的成員變量以及成員方法在同一個包中無論是其子類還是普通類都可以調(diào)其使用,在不同包中只供其子類調(diào)用。
(六)是否可以繼承String類,解釋原因
不可以,因為String類有final修飾符,而final修飾的類是不能被繼承的,實(shí)現(xiàn)細(xì)節(jié)不允許改變。
(七)stringbuffer和stringbuilder的區(qū)別
1.速度問題,或者說是執(zhí)行速度,在這方面運(yùn)行速度快慢為:
StringBuilder > StringBuffer > String
2.安全問題:
1.String中的對象是不可變的,也就可以理解為常量,顯然線程安全。
2.StringBuffer是線程安全的。
3.StringBuilder是線程不安全的。
AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer對方法加了同步鎖或者對調(diào)用的方法加了同步鎖,所以是線程安全的,但是相對應(yīng)的也會影響其執(zhí)行速度。
3.應(yīng)用場景:
1.String:適用于少量的字符串操作的情況
2.StringBuilder:適用于單線程下在字符緩沖區(qū)進(jìn)行大量操作的情況
3.StringBuffer:適用多線程下在字符緩沖區(qū)進(jìn)行大量操作的情況
如果程序不是多線程的,使用StringBuilder效率要高于StringBuffer。
(八)hashCode和equals方法的關(guān)系
1、如果eqauls()相同,那么它們的hashCode()一定要相同;
2、如果hashCode()相同,那么它們eqauls()并不一定相同.
所以,Java對于eqauls方法和hashCode方法是這樣規(guī)定的:
1、如果兩個對象相同,那么它們的hashCode值一定要相同;
2、如果兩個對象的hashCode相同,它們并不一定相同。
(九)抽象類和接口的區(qū)別
1) 都是上層的抽象層。
2) 都不能被實(shí)例化
3) 都能包含抽象的方法,這些抽象的方法用于描述類具備的功能,但是不比提供具體的實(shí)現(xiàn)。
他們的區(qū)別如下:
1) 在抽象類中可以寫非抽象的方法,從而避免在子類中重復(fù)書寫他們,這樣可以提高代碼的復(fù)用性,這是抽象類的優(yōu)勢;接口中只能有抽象的方法。
2) 一個類只能繼承一個直接父類,這個父類可以是具體的類也可是抽象類;但是一個類可以實(shí)現(xiàn)多個接口。
(十)自動裝箱與拆箱
1、自動裝箱:
基本類型的數(shù)據(jù)處于需要對象的環(huán)境中時,會自動轉(zhuǎn)為“對象”。 自動裝箱過程是通過調(diào)用包裝類的valueOf()方法實(shí)現(xiàn)的。
Integer i = 100;//自動裝箱
//相當(dāng)于編譯器自動作以下的語法編譯:
Integer i = Integer.valueOf(100);//調(diào)用的是valueOf(100),不是new Integer(100)
2、自動拆箱:
每當(dāng)需要一個值時,對象會自動轉(zhuǎn)成基本數(shù)據(jù)類型,沒必要再去顯式調(diào)用intValue()、doubleValue()等轉(zhuǎn)型方法。如 Integer i = 5;int j = i; 這樣的過程就是自動拆箱。
Integer i = 100;
int j = i;//自動拆箱
//相當(dāng)于編譯器自動作以下的語法編譯:
int j = i.intValue();