面線對象三個基本特征:繼承,封裝,多態。
繼承:子類繼承父類,子類獲得父類的屬性和方法。
封裝:將客觀事物封裝成抽象的類,并且只能讓特定的對象操作。
多態:一個類實例的相同方法在不同情形有不同的表現形式。
多態的兩種實現方式:重載和重寫。
重載(Overload):是一個類中多態性的一種表現,方法名必需相同,參數列表必需不同.(長度不同或類型不同),與返回值類型沒有關系.構造器也可以重載.方法名和類名相同,參數不同. Overloaded的方法是可以改變返回值的類型。
重寫(Override):是父類與子類之間多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫。
抽象和接口
抽象和抽象方法:abstract
1.抽象類和抽象方法都是通過abstract關鍵字修飾。
2.抽象類不能實例化。抽象類中可以沒有、有一個或者多個抽象方法,甚至全部方法都可以是抽象方法。
3.抽象方法只有方法聲明,沒用方法實現。有抽象方法的類必須聲明為抽象類。子類必須重寫所有的抽象方法才能實例化,否則子類還是一個抽象類。
接口:interface定義了一套標準(方法),這些方法通常都是沒有實現的,類可以來實現這些方法來支持(implements)這個標準
特點:
1.接口不能被實例化
2.一個類只能有一個父類,但是可以實現多個接口
3.接口不能有實例變量,但是可以有static final變量
4.接口的方法都是抽象方法 - 靜態(public static)和default方法除外
5.接口可以沒有任何方法
6.接口可以有屬性,但屬性默認是public static和final
接口和抽象的區別:
1.接口只能做方法申明,抽象類可以做方法申明,也可以做方法實現。
2.接口要被類實現,抽象類要被子類繼承。
3.接口可以繼承接口,并可以多繼承接口,但類只能單個繼承。
4.接口定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。
常用關鍵字:
static:
1.變量:被static修飾的變量叫做靜態變量(類變量),沒有被修飾的叫實例變量。
區別:靜態變量在內存中只有一份拷貝,JVM只為靜態分配一次內存,在加載過程中完成靜態變量的內存分配,直接通過類名訪問。
? ? ? ? ? 實例變量,每創建一個實例,就會為實例變量分配一次內存,實例變量可以在內存中多個拷貝,互不影響。
2.靜態方法:靜態方法可以直接通過類名調用,任何的實例也都可以調用。
因此靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的實例變量和實例方法(就是不帶static的成員變量和成員成員方法),只能訪問所屬類的靜態成員變量和成員方法
3.static代碼塊:static代碼塊也叫靜態代碼塊,是在類中獨立于類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內,JVM加載類時會執行這些靜態的代碼塊,如果static代碼塊有多個,JVM將按照它們在類中出現的先后順序依次執行它們,每個代碼塊只會被執行一次
利用靜態代碼塊可以對一些static變量進行賦值。
final:
final用于聲明屬性,方法和類,分別表示屬性不可變。
修飾類:不能被繼承;修飾方法:不能被重寫;修飾變量:不能被修改,是常量
synchronized線程、同步:
1.synchronized 關鍵字可以應用于方法或語句塊,并為一次只應由一個線程執行的關鍵代碼段提供保護。
2.synchronized 關鍵字可防止代碼的關鍵代碼段一次被多個線程執行。
3.如果應用于靜態方法,那么,當該方法一次由一個線程執行時,整個類將被鎖定。
4.如果應用于實例方法,那么,當該方法一次由一個線程訪問時,該實例將被鎖定。
5.如果應用于對象或數組,當關聯的代碼塊一次由一個線程執行時,對象或數組將被鎖定。
this:
this關鍵字必須放在非靜態方法里面
this關鍵字代表自身,在程序中主要的使用用途有以下幾個方面:
1. 使用this關鍵字引用成員變量
2.使用this關鍵字在自身構造方法內部引用其它構造方法
3.使用this關鍵字代表自身類的對象
4. 使用this關鍵字引用成員方法
修飾符:
default不加 - 在自己的package里面可用
public - 所有地方都可以用
private - 只有在自己的類里面可用
protected - 在子類和當前package
常見面試題:
1.談談final, finally, finalize的區別。
2.Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?(可以)
3.接口和抽象的區別。
4.構造器 Constructor 是否可被 Override?
答:構造器 Constructor 不能被繼承,因此不能重寫 Override,但可以被重載 Overload。
5. 兩個對象值相同(x.equals(y) == true),但卻可有不同的 hash code,這句 話對不對?
答:不對,如果兩個對象 x 和 y 滿足 x.equals(y) == true,它們的哈希碼(hash code)應當相同。(要擴展)
(1)如果兩個對象相同(equals 方法返回 true ),那么它們的 hashCode 值一定要相同;
(2)如果兩個對象的 hashCode相同,它們并不一定相同。當然,你未必要按照要求 去做,但是如果你違背了上述原則就會發現在使用容器時,相同的對象可以出現在 Set 集合中,同時增加新元素 的效率會大大下降(對于使用哈希存儲的系統,如果哈希碼頻繁的沖突將會造成存取性能急劇下降)
6.java 中實現多態的機制是什么?
答:靠的是父類或接口定義的引用變量可以指向子類或具體實現類的實例對象,而程序調用的方法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法
7.關于static和this的題:
public class This{
static int value = 9; //注意value是靜態的成員變量
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);
}}