1. 程式人生 > >面向對象的幾個問題

面向對象的幾個問題

支持 屬性 思想 類對象 部分 一次 指揮 int 將不

1.面向對象思想的特點
(1)是一種更符合我們思想習慣的思想(懶人思想,我把事情自己不做,交給別人去做)
(2)可以將復雜的事情簡單化(對使用者來說簡單了,對象裏面還是很復雜的)
(3)角色發生了轉換,將我們從執行者變成了指揮者
(4)就是不斷的創建對象,使用對象,指揮對象做事情。(如果有對象,直接用對象,對我們直接提供服務)
2.面向對象的特征
(1)封裝:是隱藏對象的屬性和實現細節,僅對外提供公共的訪問方式。
(2)繼承:把多個類中相同的屬性提取出來定義到一個類中。
(3)多態:同一個對象不同時刻體現出來的不同狀態。
3.類與對象的關系
(1)是一組相關的屬性和行為的集合(所有的同學都具備相同的屬性和行為,比如:姓名,年齡,學習,這樣就把所有的學生成為學生類)
(2)對象是該類事物的具體體現(例如每個同學都具備自己特有的屬性和行為)
(3)類是抽象(抽取出同類事物中相同的、相似的部分就叫抽象)的,對象是具體的或者是類是一般的,對象是特殊的
(4)類中可以包含成員變量、類變量、成員方法、類方法、構造函數、構造代碼塊、靜態代碼塊等
4.成員變量和局部變量的區別?
(1)在類中的位置不同
a.成員變量:在類中方法外
b.局部變量:在方法定義中或者方法聲明上
(2)在內存中的位置不同
a.成員變量:在堆內存(成員變量屬於對象,對象進堆內存)
b.局部變量:在棧內存(局部變量屬於方法,方法進棧內存)
(3)生命周期不同
a.成員變量:隨著對象的創建而存在,隨著對象的消失而消失
b.局部變量:隨著方法的調用而存在,隨著方法的調用完畢而消失
(4)初始化值不同
a.成員變量:有默認初始化值
b.局部變量:沒有默認初始化值,必須定義,賦值,然後才能使用。
5.private關鍵字的特點
(1)封裝是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式,private是實現封裝的一種形式
(2)private是一個權限修飾符,可以修飾成員變量和成員方法
(3)被private修飾的成員,只能在本類中訪問
(4)當成員變量被private關鍵字修飾後,需要提供對應的get和set方法供外部訪問
6.談談你對this的理解?
(1)this只能代表本類對象
(2)this代表所屬函數(方法)的所屬對象
(3)誰來調用我,我就代表誰
(4)this可用於區分成員變量和局部變量同名的情況

1.構造方法的特點?
(1)構造方法主要作用是給對對象的屬性進行初始化
(2)方法名與類名完全一致,沒有返回值類型,連void都沒有
(3)構造方法也是方法,只是比較特殊,是在創建對象後馬上調用,後期不能單獨調用,既然是方法,就可以重載
a.方法名相同
b.參數列表不同(數量不同,順序不同,類型不同)
c.與返回值類型無關
(4)如果自定義類中沒有提供構造方法,系統將自動提供一個無參構造方法,如果我們給出了構造方法,系統將不再提供默認的無參構方法,要想再使用空參構造,必須顯示給出
2.java中創建一個對象的過程?
(1)將類的字節碼文件加載進內存
(2)聲明一個該類類型引用
(3)在堆內存創建對象s
(4)給對象中屬性默認初始化值
(5)屬性進行顯示初始化
(6)構造方法進棧,對對象中的屬性賦值, 構造方法彈棧
(7)將對象的地址值賦值給s
3.談談你對static關鍵字的理解?
(1)被static關鍵字修飾的成員,屬於該類中所有對象的共享內容可以直接用類名調用,也可以用對象調用,但是建議用類名調用
(2)隨著類的加載而加載,優先於對象存在:隨著字節碼文件的加載而加載的,那時候還沒有對象呢
(3)靜態修飾的內容一般我們稱其為:與類相關的,類成員(靜態變量:類變量,靜態方法:類方法)
(4)在靜態方法中是沒有this關鍵字的(因為this指的是一個具體的對象,而靜態在加載到內存時還沒有具體的對象)
(5)靜態方法只能訪問靜態的成員變量和靜態的成員方法,非靜態的成員方法既可以方法靜態的成員方法和成員變量,又能訪問非靜態的成員方法和成員變量.(靜態不能訪問非靜態)
4.靜態變量和成員變量的區別?
(1)所屬不同
a.靜態變量屬於類,所以也稱為為類變量
b.成員變量屬於對象,所以也稱為實例變量(對象變量)
(2)內存中位置不同
a.靜態變量存儲於方法區的靜態區
b.成員變量存儲於堆內存
(3)內存出現時間不同
a.靜態變量隨著類的加載而加載,隨著類的消失而消失
b.成員變量隨著對象的創建而存在,隨著對象的消失而消失
(4)調用不同
a.靜態變量可以通過類名調用,也可以通過對象調用
b.成員變量只能通過對 象名調用

2.談談你對繼承的理解?
(1)繼承與類之間產生關系,子父類關系
(2)繼承提高了代碼的復用性和維護性,單同時增加了類與類之間的耦合性
(3)java只支持單繼承,不支持多繼承,但是Java支持多層繼承
(4)繼承中的註意事項:
a.子類只能繼承父類所有非私有的成員(成員方法和成員變量)
b.子類不能繼承父類的構造方法,但是可以通過super關鍵字去訪問父類構造方法。
c.不要為了部分功能而去繼承
(5)在創建對象時,子類中所有的構造方法默認都會訪問父類中空參數的構造方法
a.因為子類會繼承父類中的數據,可能還會使用父類的數據,所以,子類初始化之前,一定要先完成父類數據的初始化。
b.其實:每一個構造方法的第一條語句默認都是:super() Object類最頂層的父類。
(6)父類沒有無參構造方法,子類怎麽辦?
a.super解決:用super(....)顯式調用父類的有參構造,如:super(name,age);->super("zs",30);
b.this解決:通過this調用本類的有參構造,然後在本類的有參構造裏,又調用了父類的有參構造,相當於間接調用父類的有參構造.
c.super(…)或者this(….)必須出現在構造方法的第一條語句上,只能出現其一
(7)繼承中成員方法關系?
a.不同名的方法:直接調用就可以
b.同名的方法:稱為方法的重寫,用子類對象直接調用的是子類已經重寫的方法
c.要想調用父類的方法,可以在子類重寫的方法中添加super();

3.談談你對this和super關鍵字的理解?
(1)this:代表當前對象的引用,誰來調用我,我就代表誰
(2)super:代表當前對象父類的引用
(3)this和super的使用區別
a.調用成員變量
* this.成員變量 調用本類的成員變量,也可以調用父類的成員變量
* super.成員變量 調用父類的成員變量
b.調用構造方法
* this(...) 調用本類的構造方法
* super(...) 調用父類的構造方法
c.調用成員方法
* this.成員方法 調用本類的成員方法,也可以調用父類的方法
* super.成員方法 調用父類的成員方法
4.什麽是方法的重載和重寫?
(1)重載:在同一個類中,方法名相同、參數列表不同(數量不同、類型不同、順序不同)、與返回值類型無關的多個方法構成重載
(2)重寫:在繼承中,子父類出現了一模一樣的方法(返回值類型可以是子父類)
當子類需要父類的功能而功能主體子類有特有內容時,可以重寫父類中的方法。這樣,即沿襲了父類的功能,又定義了子類有的內容
(3)重寫的註意事項
a.父類中私有法不能被重寫,因為父類私有方法子類根本就無法繼承,既然子類無法繼承,就談不上重寫
b.子類重寫父方法時,訪問權限不能更低,最好就一致
c.父類靜態方法,子類也必須通過靜態方法進行重寫
* 其實這個算不上方法重寫,但是現實確實如此.至於為什麽算不上方法重寫(靜態只能覆蓋靜態)
d.子類重寫父類方法的時候,最好聲明一模一樣。
5.final關鍵字的特點?
(1)修飾類,類不能被繼承
(2)修飾變量,變量就變成了常量,只能被賦值一次
(3)修飾方法,方法不能被重寫(有時所有方法都很重要,都不需要被重寫,需要將類定義成final的)
(4)final修飾局部變量:基本類型,是值不能被改變,引用類型,是地址值不能被改變,對象中的屬性可以改變
(5)final修飾變量的初始化時機?
a.未被static關鍵字修飾
* 可以顯示初始化
* 可以在構造方法中初始化
b.被static修飾
* 可以顯示初始化
* 可以在靜態代碼塊中初始化
* 不能在構造方法中初始化

1.談談你對多態的理解?
(1)多態就是事物存在的多種形態
(2)多態的前提
a.要有繼承關系。
b.要有方法重寫。
c.要有父類引用指向子類對象。
(3)多態中的成員訪問特點
a.成員方法:編譯時看父類(左邊),運行時看子類(右邊)
b.成員變量:編譯時看父類(左邊),運行時看父類(左邊)
c.靜態方法:編譯看父類(左邊),運行看父類(左邊)。
(靜態和類相關,算不上重寫,所以,訪問還是左邊的)
只有非靜態的成員方法,編譯看左邊,運行看右邊
(4)多態的好處和弊端
a.好處
* 提高了代碼的維護性(繼承保證)
* 提高了代碼的擴展性(由多態保證),可以當作形式參數,可以接收任意子類對象
b.弊端
* 不能使用子類的特有屬性和行為
2.談談你對抽象類的理解?
(1)抽象類的概述?
a.在某些情況下,父類只知道子類包含怎樣的方法,無法準確知道這些子類如何實現該方法
b.多個具有相同特征的類中抽取一個抽象類,以這個抽象類為子類的模板,從而避免子類設計的隨意化
c.限制子類必須有哪些方法,不關註實現細節.
(2)抽象類特點
a.抽象類和抽象方法必須用abstract關鍵字修飾
* abstract class 類名 {}
* public abstract void 方法名();//當不知道該方法具體是怎麽實現的
b.抽象類不一定有抽象方法,有抽象方法的類一定是抽象類或者是接口
c.抽象類不能實例化那麽,抽象類如何實例化呢?
* 按照多態的方式,由具體的子類實例化。其實這也是多態的一種,抽象類多態。
d.抽象類的子類
* 要麽是抽象類
* 要麽重寫抽象類中的所有抽象方法
(3)抽象類的成員特點
a.成員變量:既可以是變量,也可以是常量。abstract是否可以修飾成員變量?不能修飾成員變量
b.構造方法:必須有。
* 用於子類訪問父類數據的初始化。
c.成員方法:既可以是抽象的,也可以是非抽象的。
* 抽象方法 強制要求子類做的事情。
* 非抽象方法 子類繼承的事情,提高代碼復用性。
3.abstract關鍵字不能與哪些關鍵字共同使用
(1)abstract和static
被abstract修飾的方法沒有方法體
被static修飾的可以用類名.調用,但是類名.調用抽象方法是沒有意義的
(2)abstract和final
被abstract修飾的方法強制子類重寫
被final修飾的不讓子類重寫,所以他倆是矛盾
(3)abstract和private
被abstract修飾的是為了讓子類看到並強制重寫
被private修飾不讓子類訪問,所以他倆是矛盾的
4.談談你對接口的理解?
(1)接口概述
回顧貓狗案例,它們僅僅提供一些基本功能。
比如:貓鉆火圈,狗跳高等功能,不是動物本身就具備的,是在後面的培養中訓練出來的,這種額外的功能,java提供了接口表示。
(2)接口特點
a.接口用關鍵字interface表示
* interface 接口名 {}
b.類實現接口用implements表示
* class 類名 implements 接口名 {}
c.接口不能實例化
* 那麽,接口如何實例化呢?
* 按照多態的方式來實例化。
d.接口的子類
* a:可以是抽象類。但是意義不大。
* b:可以是具體類。要重寫接口中的所有抽象方法。
(3)接口成員特點
a.成員變量只能是常量,並且是靜態的並公共的。
* 默認修飾符:public static final
* 建議:自己手動給出。
b.構造方法:接口沒有構造方法。
c.成員方法:只能是抽象方法。
* 默認修飾符:public abstract
* 建議:自己手動給出。
5.簡述類與類,類與接口,接口與接口的關系?
(1)類與類:
a.繼承關系,只能單繼承,可以多層繼承。
(2)類與接口:
a.實現關系,可以單實現,也可以多實現。
b.並且還可以在繼承一個類的同時實現多個接口。
(3)接口與接口:
a.繼承關系,可以單繼承,也可以多繼承。
6.談談你對抽象類和接口的理解?
(1)成員區別
a.抽象類:
* 成員變量:可以變量,也可以常量
* 構造方法:有
* 成員方法:可以抽象,也可以非抽象
b.接口:
* 成員變量:只可以常量
* 成員方法:只可以抽象
(2)關系區別
a.類與類
* 繼承,單繼承
b.類與接口
* 實現,單實現,多實現
c.接口與接口
* 繼承,單繼承,多繼承
(3)設計理念區別(面試時最好最初例子來)
a.抽象類 被繼承體現的是:”is a”(屬於)的關系。抽象類中定義的是該繼承體系的共性功能。
b.接口 被實現體現的是:”like a”的關系。接口中定義的是該繼承體系的擴展功能。
* 對事物本質的抽象用抽象類,對事物功能的擴展用接口

1.java中哪幾種權限修飾符,其對應的訪問權限是什麽?
本類 同一個包下(子類和無關類) 不同包下(子類) 不同包下(無關類)
private Y
默認 Y Y
protected Y Y Y
public Y Y Y Y

面向對象的幾個問題