成員變量與局部變量:
具體定義不再贅述,記錄一些以前忽視的差異;
成員變量在聲明過程中會被系統默認初始化,默認值0;
局部變量在聲明過程中不會被系統默認初始化;
(final 修飾的為特殊情況,不會初始化)
局部變量和成員變量命名可以重復,當調用過程中沖突時,符合就近原則。(優先調用局部變量)
靜態變量、靜態方法:
靜態變量可以通過對象名直接訪問,也可以直接通過類名訪問。
非靜態類不能以此方式調用,需要聲明類后,通過類調用。
public class HelloWorld {
static int staticInt = 99;
public static void main(String[] args) {
System.out.println(staticInt);
System.out.println(HelloWorld.staticInt);
}
}
與靜態變量一樣靜態方法可以通過類名直接調用,而不需要實例化類的對象。
弊端:
靜態方法是屬于類的,內存必須為它分配內存空間,這個空間一直由靜態方法占用,內存管理器不會由于靜態方法沒有被調用而將靜態方法的存儲空間收回,這樣如果將所有的方法都聲明為靜態方法,就會占用大量的內存空間。
關于內部類的概念:
靜態內部類:
靜態相關訪問非靜態內容都會受到限制,如靜態內部類不能直接訪問外部類的非靜態成員。同樣,靜態內容聲明較為直接,創建靜態內部類的對象時,不需要外部類的對象,可以直接創建 內部類 對象名= new 內部類();
方法內部類:
方法內部類就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。
Object類:
ToString():
ToString()方法時Object類中的方法,因為所有的類默認繼承Object類,所以在將類作為字符串輸出時,都會默認調用ToString()方法,一般時將對象轉換為關于內存地址的哈希數。如果我們希望返回對象的屬性,則需要在對象中對ToString()方法進行重寫。
equals():
A.equals(B) 比較的是A,B兩個對象的引用是否指向同一個內存區域。
當然,該方法可以由IDE自動重寫。
多態:
引用的多態:
父類引用指向本類;
父類引用指向子類;
Animal animal1 = new Animal();
Animal animal2 = new Dog();
方法的多態:
本類方法的調用;
子類對父類方法的繼承、重寫等。
類型轉化:
Animal animal ;
Dog dog = (Dog)new Animal(); //強制類型轉化 animal->dog
animal = dog; //自動類型轉化dog ->animal
Cat cat1 = (Cat) animal; // 雖然不報錯,但是錯誤。 轉化關系相當于dog->cat
通過instanceof 關鍵字判斷是否包含,從而決定是否可以轉化。所以在使用強制轉化時,最好通過instanceof關鍵字判斷一下。
if(animal instanceof Cat){
System.out.printf("animal 對象含有 Cat 類");
}
接口相關:
匿名內部類:
IPlayGame 為接口,接口中的方法只能聲明,無法做具體描述。所以在new對象的時候,需要將抽象方法具體化。
IPlayGame iPlayGame = new IPlayGame() {
@Override
public void PlayGame() {
System.out.printf("使用匿名內部類");
}
};
iPlayGame.PlayGame();
new IPlayGame(){
@Override
public void PlayGame() {
System.out.println("使用匿名內部類2");
}
}.PlayGame();