java多态可以传匿名对象吗_Java复习笔记2--匿名类和多态
匿名類
Anonymous classes enable you to make your code more concise. They enable you to declare and instantiate a class at the same time. They are like local classes except that they do not have a name. Use them if you need to use a local class only once.
private?ServiceConnection?connection?=?new?ServiceConnection()?{
?
@Override
public?void?onServiceDisconnected(ComponentName?name)?{
}
?
@Override
public?void?onServiceConnected(ComponentName?name,?IBinder?service)?{
myBinder?=?(MyService.MyBinder)?service;
myBinder.startDownload();
}
注意事項
**1、**使用匿名內部類時,我們必須是繼承一個類或者實現一個接口,但是兩者不可兼得,同時也只能繼承一個類或者實現一個接口。
2、匿名內部類中是不能定義構造函數的。
3、匿名內部類中不能存在任何的靜態成員變量和靜態方法。
4、匿名內部類為局部內部類,所以局部內部類的所有限制同樣對匿名內部類生效。
5、匿名內部類不能是抽象的,它必須要實現繼承的類或者實現的接口的所有抽象方法。
我們給匿名內部類傳遞參數的時候,若該形參在內部類中需要被使用,那么該形參必須要為final。也就是說:當所在的方法的形參需要被內部類里面使用時,該形參必須為final。
拷貝引用,為了避免引用值發生改變,例如被外部類的方法修改等,而導致內部類得到的值不一致,于是用final來讓該引用不可改變。
**????? 故如果定義了一個匿名內部類,并且希望它使用一個其外部定義的參數,那么編譯器會要求該參數引用是final的。**
匿名內部類初始化通過寫代碼塊,不可以寫自己的構造函數
Java 多態
面向對象編程有三個特征,即封裝、繼承和多態。
封裝隱藏了類的內部實現機制,從而可以在不影響使用者的前提下改變類的內部結構,同時保護了數據。
繼承是為了重用父類代碼,同時為實現多態性作準備。那么什么是多態呢?
方法的重寫、重載與動態連接構成多態性。Java之所以引入多態的概念,原因之一是它在類的繼承問題上和C++不同,后者允許多繼承,這確實給其帶來的非常強大的功能,但是復雜的繼承關系也給C++開發者帶來了更大的麻煩,為了規避風險,Java只允許單繼承,派生類與基類間有IS-A的關系(即“貓”is a “動物”)。這樣做雖然保證了繼承關系的簡單明了,但是勢必在功能上有很大的限制,所以,Java引入了多態性的概念以彌補這點的不足,此外,抽象類和接口也是解決單繼承規定限制的重要手段。同時,多態也是面向對象編程的精髓所在。
多態就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用在編程時并不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。因為在程序運行時才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實現上,從而導致該引用調用的具體方法隨之改變,即不修改程序代碼就可以改變程序運行時所綁定的具體代碼,讓程序可以選擇多個運行狀態,這就是多態性。
對于面向對象而言,多態分為編譯時多態和運行時多態。其中編譯時多態是靜態的,主要是指方法的重載,它是根據參數列表的不同來區分不同的函數,通過編譯之后會變成兩個不同的函數,在運行時談不上多態。而運行時多態是動態的,它是通過動態綁定來實現的,也就是我們所說的多態性。
向上轉型
我定義了一個子類Cat,它繼承了Animal類,那么后者就是前者是父類。我可以通過
Cat c = new Cat();
實例化一個Cat的對象,這個不難理解。但當我這樣定義時:
Animal a = new Cat();
這代表什么意思呢?
很簡單,它表示我定義了一個Animal類型的引用,指向新建的Cat類型的對象。由于Cat是繼承自它的父類Animal,所以Animal類型的引用是可以指向Cat類型的對象的。那么這樣做有什么意義呢?因為子類是對父類的一個改進和擴充,所以一般子類在功能上較父類更強大,屬性較父類更獨特,
+定義一個父類類型的引用指向一個子類的對象既可以使用子類強大的功能,又可以抽取父類的共性。
+所以,父類類型的引用可以調用父類中定義的所有屬性和方法,而對于子類中定義而父類中沒有的方法,它是無可奈何的;
+同時,父類中的一個方法只有在在父類中定義而在子類中沒有重寫的情況下,才可以被父類類型的引用調用;
+對于父類中定義的方法,如果子類中重寫了該方法,那么父類類型的引用將會調用子類中的這個方法,這就是動態連接。
對于多態,可以總結它為:
一、使用父類類型的引用指向子類的對象;
二、該引用只能調用父類中定義的方法和變量;
三、如果子類中重寫了父類中的一個方法,那么在調用這個方法的時候,將會調用子類中的這個方法;(動態連接、動態調用)
四、變量不能被重寫(覆蓋),”重寫“的概念只針對方法,如果在子類中”重寫“了父類中的變量,那么在編譯時會報錯。
參數是父類,傳入的是子類也屬于向上轉型
向下轉型
class?Fruit
{
public?void?myName()
{
System.out.println("我是父類??水果...");
}
}
?
class?Apple?extends?Fruit
{
@Override
public?void?myName()
{
System.out.println("我是子類??蘋果...");
}
public?void?myMore()
{
System.out.println("我是你的小呀小蘋果~~");
}
}
?
public?class?Sys{
public?static?void?main(String[]?args)?{
Fruit?a=new?Apple();?//向上轉型
a.myName();
?
Apple?aa=(Apple)a;?//向下轉型,編譯和運行皆不會出錯(正確的)
aa.myName();//向下轉型時調用的是子類的
aa.myMore();;
?
Fruit?f=new?Fruit();
Apple?aaa=(Apple)f;?//-不安全的---向下轉型,編譯無錯但會運行會出錯
aaa.myName();
aaa.myMore();
}
}
a指向子類的對象,所以子類的實例aa也可以指向a啊~~
向下轉型后因為都是指向子類對象,所以調用的當然全是子類的方法~~
f是父類對象,子類的實例aaa肯定不能指向父類f啊~~~
3.Java為了解決不安全的向下轉型問題,引入泛型的概念
4.為了安全的類型轉換,最好先用 if(A instanceof ?B) 判斷一下下~~
2種實現形式
繼承
基于繼承的實現機制主要表現在父類和繼承該父類的一個或多個子類對某些方法的重寫,多個子類對同一方法的重寫可以表現出不同的行為。
接口
接口是通過實現接口并覆蓋接口中同一方法的幾不同的類體現的。
在接口的多態中,指向接口的引用必須是指定這實現了該接口的一個類的實例程序,在運行時,根據對象引用的實際類型來執行對應的方法。
繼承都是單繼承,只能為一組相關的類提供一致的服務接口。但是接口可以是多繼承多實現,它能夠利用一組相關或者不相關的接口進行組合與擴充,能夠對外提供一致的服務接口。所以它相對于繼承來說有更好的靈活性。
?
總結
以上是生活随笔為你收集整理的java多态可以传匿名对象吗_Java复习笔记2--匿名类和多态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: skywalking(3)
- 下一篇: Base64编码的原理与常用实现