一、object類
object類是層次類結構的根類,就是所有物件的直接父類或間接父類。裡面一定定義的所有物件的都具備的功能。這個是隱式的。就相當於:
class demo extends object
而extendsobject 其實是隱式的,但確實繼承了object類,並且具有類中的方法。檢視api文件,常用的方法有:
equals(object)方法,比較物件是否相等,其實是比較物件位址值是否相等。而且,這方法接收的是乙個object型別的物件,既然object是所有類的父類,那麼這裡就實現了多型。在我們應用的是,我們可以複寫其中的equals方法,進行我們想要進行的比較方法。複寫的是時候,注意的一點就是:接收的引數是object型別,不能改變,否則就不是複寫,所以當我們比較物件中特有資料時候,複寫中還要加上一些判斷和型別向下轉型的動作。
tostring()方法,返回該物件的字串形式。
getclass()方法,這方法在反射時常用。返回此object執行時的類,注意是類。返回值為class。重點說下這個方法,首先我們建立物件時會載入相關的類檔案,而類檔案裡面有關於食物的具體描述,比如說名稱、方法和功能,而這類class檔案在硬碟裡是乙個個實實在在的個體,可以把這些檔案看做是物件,那麼以物件導向的概念來說,這些class檔案就會有乙個類來描述它,這個類就是class,只是名字起為class。
當我們使用getclass方法時,就返回了乙個型別為class的引用,程式如下:
class c = 物件.getclass();
這就把物件相對應的class型別返回了,我的理解是,把描述這個物件的類檔案整體返回了,有了這個物件的類檔案,通過引用c,我們就可以獲取這個類的名字,方法,引數等等。
而class這個類中還有好多方法,比如getname(),就可以返回這個類的名字。
不部分一定要了解,熟悉。
我們再返回來看tostring(),它就是返回物件的類名加上雜湊值。其中的程式為:
d.getclass().getname()+」@」+integer.tohexstring(d.hashcode())
當然tostring方法也是可以複寫的,寫成我們想要的方法。
總結來說:
1)object類是所有類的父類。所以object的引用可以接受其他任何子類物件,這裡就是多型。
2)其他類是隱式繼承object類,具有object了方法 3)
複寫object的方法時,要注意如果使用子類特有方法,要向下轉型,必要時要做一些判斷。比如euqals()方法的複寫。 4)
重點理解getclass()方法,這對後期學習反射來說挺重要
二、內部類
定義上,將乙個類定義在另乙個類裡面,對裡面那個類就稱為內部類。
格式來說:
class a }
這裡b類就是內部類。
既然內部類在外部類裡面,就相當於乙個外部類中的乙個成員,所以就內部類就可以直接訪問外部類成員,私有的成員也是可以訪問的。而外部類缺不能直接訪問內部類的成員,必須先建立內部類物件才可以訪問。
方式一,建立內部類物件,訪問內部類成員,程式為:
classouter }
voidmethod() }
之後只要在主函式中建立outer的物件,呼叫method方法即可。
方式二,直接在主方法中訪問內部類成員。程式為:
在主函式中:
outer.inner in = new outer().newinner();
in.function(); //直接呼叫內部類成員
這裡原因是因為內部類依存於外部類,所以要前面表示是外部類,也就是相當於內部類的乙個成員。這樣,內部類就可以被private修飾,成員麼,就可以修飾的。
個人理解來看,內部類也是乙個類,但是給他上了乙個標籤,做好多事都得呆著這標籤。
總結來說:
1)內部類可以直接訪問外部類中的成員,包括私有成員 2)
之所以可以直接訪問外部類中的成員,因為內部類中持有乙個外部類的引用 3)
外部類要訪問內部類,必須建立內部類物件 4)
當內部類定義在外部類成員位置上,而且不是私有的,就可以再主函式中直接建立內部類物件,格式就是方式二 5)
當內部類在成員位置上,就可以被成員修飾符修飾,比如private修飾符修飾。 6)
當內部類被static修飾時,就成靜態內部類,這時內部類只能直接訪問外部類中的static成員
外部其他類,訪問static內部類的非靜態成員
new outer.inner().function();
外部其他類,訪問static內部類的靜態成員
user.inner.function();
以上兩個實際開發中用的都比較少。 7)
注意:當內部類定義了static成員,內部類也必須是靜態的 8)
當外部類的靜態方法訪問內部類時,內部類也必須是static的
三、內部類定義原則
類是描述現實中事物,當描述事物時,事物的內部還有事物,該事物用內部類來描述,因為內部事物在只用外部事物的內容。
就比如描述電腦,而電腦裡有顯示器,鍵盤,而它們各有各的功能屬性和行為,但是這兩個又和電腦本身有聯絡,所以按照現實生活聯絡來說,這樣就可以定義內部類,這樣是最優的。
四、匿名內部類(常用)
1、內部類定義在區域性中
內部類可以定義在外部類中的成員部分或者區域性部分。如果內部類放在區域性的時候,要在區域性建立內部類物件並呼叫內部類裡的方法時,物件建立要在內部類語句後面。具體程式為:
class outer
} newinner().function();//建立物件語句必須在內部類之後}
} 需要注意的是:1)內部類定義在區域性時,不可以被成員修飾符修飾
2)內部類定義在區域性時,可以直接訪問外部類成員,因為持有外部類中的引用
3)內部類定義在區域性時,不可以訪問它所在的區域性中的變數,只能訪問被final修飾的區域性變數。
就上上述程式中,method方法中如果加入乙個區域性變數,或者加入引用引數(也就是區域性變數),那麼想要內部類引用的話,就要加上final。程式如下:
voidmethod(finalint x ) }
newinner().function(); }
2、匿名內部類
匿名內部類其實就是內部類的簡寫格式
先看一段程式:
classouter }
voidmethod() }
inner為內部類,我們想要的是乙個匿名的內部類,那這類類就沒有名字:
class
那麼這個內部類既然沒有名字,那麼在外部類就無法建立其物件,這就涉及到匿名內部類定義的前提:內部類必須是繼承乙個類或者實現介面。
有這樣乙個前提,那麼就可以通過多型,即父類或介面的引用來指向物件,把斜體的部分:
classouter
}
voidmethod() }
改為如下程式:
voidmethod()
}
}
}這就是匿名內部類的寫法,這就是上面的斜的部分的簡寫,這是乙個物件,是乙個子類的物件。既然這就是乙個物件,那麼在大括號最後可以加.fucntion(); 進行方法呼叫,程式如下:newadvice()
}.function();
個人認為,就是內部類繼承乙個類或實現乙個介面時,我們引用內部類時,直接在方法中建立匿名內部類,相當於介面引用後直接在內部寫入內部類實現的功能即可,這就是乙個大的物件,這個物件就是內部類的物件,就可以用多型給他起名字然後按照物件的方法呼叫其中的方法即可。
總結來說:1)
匿名內部類時內部類的簡寫格式 2)
定義匿名內部類的前提:內部類必須繼承乙個類或實現介面 3)
匿名內部類格式:new 父類或幾口( )
4)匿名內部類其實就是乙個匿名的子類物件(就是那個內部類的物件),只是少名字,加入內部類的內容,本質上還是乙個物件,而且是子類物件。 5)
匿名內部類中定義的方法最好是一到兩個
6)
匿名內部類可以作為引數傳遞,這樣方便很多,之後用到會很多
就是說,我的乙個方法method(inte***ce in),要傳入乙個介面型別的物件,那麼通常的方法就是建立乙個類,這個類實現這個介面的方法,然後利用多型傳入這個類的物件。現在有了匿名內部類,就可以直接建立匿名內部類傳入,具體程式為:
public static void show ( new advice()
}
);
注意:即便是內部類中沒有繼承一類或實現介面,但是它有父類object,同樣可以建立匿名內部類。
黑馬程式設計師 物件導向 Object與內部類
1 object 是所有類直接或間接的父類,該類中具備所有物件都具備的功能。2 內部類 將以各類定義在另乙個類裡面,內部的類就叫做內部類。內部類的訪問規則 內部類可以直接訪問外部類中的成員,包括私有。外部類要訪問內部類,必須建立內部類的物件。內部類之所以可以直接訪問外部類中的成員,因為內部類中有乙個...
黑馬程式設計師 內部類
windows phone 7手機開發 net培訓 期待與您交流!什麼是內部類呢?將乙個類定義在另乙個類的裡面,對裡面那個類就稱為內部類 內建類 巢狀類 內部類的訪問特點有哪些呢?內部類可以直接訪問外部類中的成員,包括私有成員 而外部類要訪問內部類中的成員必須要建立內部類的物件。內部類有什麼作用呢?...
黑馬程式設計師 內部類
asp.net android io開發s net培訓 期待與您交流!內部類即在乙個外部類的內部再定義乙個類。內部類作為外部類的乙個成員,且依附於外部類而存在。內部類的訪問規則 1 內部類可以直接訪問外部類中的成員,包括私有。2 外部類需要訪問內部類時,必須建立內部類物件。訪問格式 外部類名.內部類...