1. 程式人生 > >方法覆蓋與方法過載,介面與抽象類的區別

方法覆蓋與方法過載,介面與抽象類的區別

1:方法覆蓋(Overriding)和方法過載(Overloading)是什麼意思? 重寫和過載的區別?
答:Java中的方法過載發生在同一個類裡面兩個或者是多個方法的方法名相同但是引數不同的情況。與此相對,方法覆蓋是說子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,引數列表和返回型別。覆蓋者可能不會限制它所覆蓋的方法的訪問。
過載(Overloading)
(1) 方法過載是讓類以統一的方式處理不同型別資料的一種手段。多個同名函式同時存在,具有不同的引數個數/型別。過載Overloading是一個類中多型性的一種表現。
(2) Java的方法過載,就是在類中可以建立多個方法,它們具有相同的名字,但具有不同的引數和不同的定義。呼叫方法時通過傳遞給它們的不同引數個數和引數型別來決定具體使用哪個方法, 這就是多型性。
(3) 過載的時候,方法名要一樣,但是引數型別和個數不一樣,返回值型別可以相同也可以不相同。無法以返回型別作為過載函式的區分標準。                                                                                            重寫(Overriding)
(1) 父類與子類之間的多型性,對父類的函式進行重新定義。如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding)。在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫。方法重寫又稱方法覆蓋。
(2)若子類中的方法與父類中的某一方法具有相同的方法名、返回型別和引數表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。(3)子類函式的訪問修飾許可權不能少於父類的;


2:介面和抽象類的區別是什麼? 
答:介面(interface)可以說成是抽象類的一種特例,介面中的所有方法都必須是抽象的。介面中的方法定義預設為public abstract型別,介面中的成員變數型別預設為public static final (這裡需要說一點,既然一個變數被final修飾了,那麼這個變數就是一個常量!!!!!變數必須初始化成常量!!!!!)
下面比較一下兩者的語法區別:
(1)抽象類可以有構造方法,介面中不能有構造方法。
(2)抽象類中可以有普通成員變數,介面中沒有普通成員變數!!!!!!!
(3)抽象類中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。
(4)抽象類中的抽象方法的訪問型別可以是public,protected和(預設型別,雖然eclipse下不報錯,但應該也不行),但介面中的抽象方法只能是public型別的,並且預設即為public abstract型別。
(5)抽象類中可以包含靜態方法(static),介面中不能包含靜態方法.
(6)抽象類和介面中都可以包含靜態成員變數(static),抽象類中的靜態成員變數的訪問型別可以任意,但介面中定義的變數只能是public static final型別,並且預設即為public static final型別。
(7) 一個類可以實現多個介面,但只能繼承一個抽象類。
何時用介面,何時用抽象類?
子類繼承抽象類就不能再繼承其他類(java的單繼承原則),所以有抽象方法時優先使用介面定義.
如果所有方法都沒有實現,優先使用介面.
一些方法已經可以實現,而另一些方法無法或不想實現時,且繼承(實現)關係很簡單時,考慮用抽象類定義,留給後代去實現。


3:建立執行緒有幾種不同的方式?你喜歡哪一種?為什麼?
答:有兩種方式可以用來建立執行緒:
繼承Thread類
實現Runnable介面
實現Runnable介面這種方式更受歡迎,因為這不需要繼承Thread類。在應用設計中已經繼承了別的物件的情況下,這需要多繼承(而Java不支援多繼承),只能實現介面。同時,執行緒池也是非常高效的,很容易實現和使用。


4:List,Set,Map,哪幾個是Collection的子介面?各有什麼特點
(1)list和set是collection的子介面
(2)list:元素有放入順序,元素可重複 
(3)set:元素無放入順序,元素不可重複(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的) 
(4)map:可以把鍵(key)對映到值(value)的物件,鍵不能重複