面線對象三個基本特征:繼承教沾,封裝蒲跨,多態(tài)。
繼承:子類繼承父類授翻,子類獲得父類的屬性和方法或悲。
封裝:將客觀事物封裝成抽象的類,并且只能讓特定的對象操作堪唐。
多態(tài):一個類實例的相同方法在不同情形有不同的表現(xiàn)形式巡语。
多態(tài)的兩種實現(xiàn)方式:重載和重寫。
重載(Overload):是一個類中多態(tài)性的一種表現(xiàn)羔杨,方法名必需相同,參數(shù)列表必需不同.(長度不同或類型不同),與返回值類型沒有關(guān)系.構(gòu)造器也可以重載.方法名和類名相同捌臊,參數(shù)不同. Overloaded的方法是可以改變返回值的類型。
重寫(Override):是父類與子類之間多態(tài)性的一種表現(xiàn)兜材。如果在子類中定義某方法與其父類有相同的名稱和參數(shù)理澎,我們說該方法被重寫逞力。
抽象和接口
抽象和抽象方法:abstract
1.抽象類和抽象方法都是通過abstract關(guān)鍵字修飾。
2.抽象類不能實例化糠爬。抽象類中可以沒有寇荧、有一個或者多個抽象方法,甚至全部方法都可以是抽象方法执隧。
3.抽象方法只有方法聲明揩抡,沒用方法實現(xiàn)。有抽象方法的類必須聲明為抽象類镀琉。子類必須重寫所有的抽象方法才能實例化峦嗤,否則子類還是一個抽象類。
接口:interface定義了一套標準(方法)屋摔,這些方法通常都是沒有實現(xiàn)的烁设,類可以來實現(xiàn)這些方法來支持(implements)這個標準
特點:
1.接口不能被實例化
2.一個類只能有一個父類,但是可以實現(xiàn)多個接口
3.接口不能有實例變量钓试,但是可以有static final變量
4.接口的方法都是抽象方法 - 靜態(tài)(public static)和default方法除外
5.接口可以沒有任何方法
6.接口可以有屬性装黑,但屬性默認是public static和final
接口和抽象的區(qū)別:
1.接口只能做方法申明,抽象類可以做方法申明弓熏,也可以做方法實現(xiàn)恋谭。
2.接口要被類實現(xiàn),抽象類要被子類繼承挽鞠。
3.接口可以繼承接口疚颊,并可以多繼承接口,但類只能單個繼承滞谢。
4.接口定義的變量只能是公共的靜態(tài)的常量串稀,抽象類中的變量是普通變量。
常用關(guān)鍵字:
static:
1.變量:被static修飾的變量叫做靜態(tài)變量(類變量)狮杨,沒有被修飾的叫實例變量母截。
區(qū)別:靜態(tài)變量在內(nèi)存中只有一份拷貝,JVM只為靜態(tài)分配一次內(nèi)存橄教,在加載過程中完成靜態(tài)變量的內(nèi)存分配清寇,直接通過類名訪問。
? ? ? ? ? 實例變量护蝶,每創(chuàng)建一個實例华烟,就會為實例變量分配一次內(nèi)存,實例變量可以在內(nèi)存中多個拷貝持灰,互不影響盔夜。
2.靜態(tài)方法:靜態(tài)方法可以直接通過類名調(diào)用,任何的實例也都可以調(diào)用。
因此靜態(tài)方法中不能用this和super關(guān)鍵字喂链,不能直接訪問所屬類的實例變量和實例方法(就是不帶static的成員變量和成員成員方法)返十,只能訪問所屬類的靜態(tài)成員變量和成員方法
3.static代碼塊:static代碼塊也叫靜態(tài)代碼塊,是在類中獨立于類成員的static語句塊椭微,可以有多個洞坑,位置可以隨便放,它不在任何的方法體內(nèi)蝇率,JVM加載類時會執(zhí)行這些靜態(tài)的代碼塊迟杂,如果static代碼塊有多個,JVM將按照它們在類中出現(xiàn)的先后順序依次執(zhí)行它們本慕,每個代碼塊只會被執(zhí)行一次
利用靜態(tài)代碼塊可以對一些static變量進行賦值排拷。
final:
final用于聲明屬性,方法和類间狂,分別表示屬性不可變攻泼。
修飾類:不能被繼承;修飾方法:不能被重寫鉴象;修飾變量:不能被修改,是常量
synchronized線程何鸡、同步:
1.synchronized 關(guān)鍵字可以應用于方法或語句塊纺弊,并為一次只應由一個線程執(zhí)行的關(guān)鍵代碼段提供保護。
2.synchronized 關(guān)鍵字可防止代碼的關(guān)鍵代碼段一次被多個線程執(zhí)行骡男。
3.如果應用于靜態(tài)方法淆游,那么,當該方法一次由一個線程執(zhí)行時隔盛,整個類將被鎖定犹菱。
4.如果應用于實例方法,那么吮炕,當該方法一次由一個線程訪問時腊脱,該實例將被鎖定。
5.如果應用于對象或數(shù)組龙亲,當關(guān)聯(lián)的代碼塊一次由一個線程執(zhí)行時陕凹,對象或數(shù)組將被鎖定。
this:
this關(guān)鍵字必須放在非靜態(tài)方法里面
this關(guān)鍵字代表自身鳄炉,在程序中主要的使用用途有以下幾個方面:
1. 使用this關(guān)鍵字引用成員變量
2.使用this關(guān)鍵字在自身構(gòu)造方法內(nèi)部引用其它構(gòu)造方法
3.使用this關(guān)鍵字代表自身類的對象
4. 使用this關(guān)鍵字引用成員方法
修飾符:
default不加 - 在自己的package里面可用
public - 所有地方都可以用
private - 只有在自己的類里面可用
protected - 在子類和當前package
常見面試題:
1.談?wù)刦inal, finally, finalize的區(qū)別杜耙。
2.Overload和Override的區(qū)別。Overloaded的方法是否可以改變返回值的類型?(可以)
3.接口和抽象的區(qū)別拂盯。
4.構(gòu)造器 Constructor 是否可被 Override?
答:構(gòu)造器 Constructor 不能被繼承佑女,因此不能重寫 Override,但可以被重載 Overload。
5. 兩個對象值相同(x.equals(y) == true)团驱,但卻可有不同的 hash code摸吠,這句 話對不對?
答:不對,如果兩個對象 x 和 y 滿足 x.equals(y) == true店茶,它們的哈希碼(hash code)應當相同蜕便。(要擴展)
(1)如果兩個對象相同(equals 方法返回 true ),那么它們的 hashCode 值一定要相同;
(2)如果兩個對象的 hashCode相同贩幻,它們并不一定相同轿腺。當然,你未必要按照要求 去做丛楚,但是如果你違背了上述原則就會發(fā)現(xiàn)在使用容器時族壳,相同的對象可以出現(xiàn)在 Set 集合中,同時增加新元素 的效率會大大下降(對于使用哈希存儲的系統(tǒng)趣些,如果哈希碼頻繁的沖突將會造成存取性能急劇下降)
6.java 中實現(xiàn)多態(tài)的機制是什么?
答:靠的是父類或接口定義的引用變量可以指向子類或具體實現(xiàn)類的實例對象仿荆,而程序調(diào)用的方法在運行期才動態(tài)綁定,就是引用變量所指向的具體實例對象的方法坏平,也就是內(nèi)存里正在運行的那個對象的方法拢操,而不是引用變量的類型中定義的方法
7.關(guān)于static和this的題:
public class This{
static int value = 9; //注意value是靜態(tài)的成員變量
public static void main(String[] args) throws Exception{
new This().printValue();
}
private void printValue(){
int value = 69;
System.out.println(this.value);
System.out.println(value);
}}