多態(tài)對象的多中形態(tài)
1.引用的多態(tài)
1.父類的引用可以指向本類的對象
2.父類的引用可以指向子類的對象
2.方法的多態(tài)
1.創(chuàng)建本類對象時,調(diào)用的方法為本類的方法。
2.創(chuàng)建子類對象時,調(diào)用的方法為子類重寫的方法或繼承的方法
父類
package com.imooc;
public class Animal {
public int age=10;
public String name;
public void eat(){
System.out.println("動物具有吃的能力");
}
}
子類
package com.imooc;
public class Dog extends Animal {
public int age=20;
public void eat(){
System.out.println("狗愛吃骨頭");
}
public void method(){
System.out.println(age);
System.out.println(super.age);
}
}
主方法
package com.imooc;
public class Initial {
public static void main(String[] args) {
Animal obj1=new Animal(); //父類的引用可以指向本類的對象
Animal obj2= new Dog(); //父類的引用可以指向子類的對象
obj1.eat(); //調(diào)用本類中的方法
obj2.eat(); //調(diào)用的方法為子類重寫的方法或繼承的方法
obj2.method();//不能調(diào)用子類中獨有的方法 ,錯誤寫法
}
}
3.多態(tài)中引用類型的轉(zhuǎn)換
1.向上類型的轉(zhuǎn)換,是小類型向大類型轉(zhuǎn)換
2.向下類型的轉(zhuǎn)換,是大類型向小類型轉(zhuǎn)換存在一定的風(fēng)險。
通常會用instanceof關(guān)鍵字來判斷是否包含某種類型,返回一個boolean值
package com.imooc;
public class Initial {
public static void main(String[] args) {
Dog dog=new Dog();
Animal animal=dog;//向上類型的轉(zhuǎn)換
Dog dog2=(Dog)animal;//向下類型轉(zhuǎn)換,強制轉(zhuǎn)換
if(animal instanceof Cat){
Cat cat=(Cat)animal;
}else{
System.out.println("無法進行類型轉(zhuǎn)換");
}
}
}
4.抽象類
抽象類前使用abstract關(guān)鍵字修飾的類,為抽象類
抽象類的作用:限制規(guī)定子類必須實現(xiàn)某些方法,但不必關(guān)注細節(jié)
1.應(yīng)用場景
1.在某些情況下,某個父類只知道其子類應(yīng)該包含怎樣的方法,但無法準(zhǔn)確知道這些子類如何實現(xiàn)這些方法。
2.從多個具有相同特征的類中抽象出一個抽象類,以這個抽象類作為子類一個模板,從而避免了設(shè)計子類的隨便性
3.使用規(guī)則
a.abstract定義抽象類
b.abstract定義抽象的方法,只有聲明,不需要實現(xiàn)。
c.包含抽象方法的類是抽象類。
d.抽象類中可以包含普通的方法,也可以包含抽象方法
e.抽象類不可以直接創(chuàng)建,可以定義引用變量。
5.接口
接口可以理解為一種特殊的類,由全局常量和公共抽象方法組成。
類是一種具體的實現(xiàn)體,而接口定義了某一批類所需要遵守的規(guī)范,接口不關(guān)心這些類的內(nèi)部數(shù)據(jù),也不關(guān)心這些類里方法實現(xiàn)細節(jié),它只規(guī)定這些類里必須提供某些方法
1.接口的定義
和類的定義不同,接口的定義不在使用class關(guān)鍵字,而是使用interface關(guān)鍵字。
2.接口的基本語法

注意:接口一般是用來被繼承和被實現(xiàn)的,修飾符一般用public,接口中的1.屬性是常量,即使定義時不添加 public static final ,系統(tǒng)也會自動加上。
2.接口中的方法只能是抽象方法,在使用時即使不添加public abstract ,系統(tǒng)也會自動加上。
3.接口也是抽象的在修飾符后面需要加上abstract,如果不加系統(tǒng)會給我們自動加上。
3.使用接口
一個類可以實現(xiàn)一個或多個接口,實現(xiàn)一個接口用implements關(guān)鍵字,java中一個類只能繼承一個父類,不夠靈活,通過多個接口可以做補充。

4.抽象類圖形分析

可以定義一個Telphone抽象類,用CellPhone和Smartphone繼承抽象類。
抽象類
package com.xhouxiang;
public abstract class TelePhone {
public abstract void message();
public abstract void tell();
}
CellPhone繼承
package com.xhouxiang;
public class CellPhone extends TelePhone {
@Override
public void message() {
// TODO Auto-generated method stub
System.out.println("通過鍵盤發(fā)短信");
}
@Override
public void tell() {
// TODO Auto-generated method stub
System.out.println("通過鍵盤打電話");
}
}
SmartPhone繼承
package com.xhouxiang;
public class SmartPhone extends TelePhone {
@Override
public void message() {
// TODO Auto-generated method stub
System.out.println("通過語音發(fā)短信");
}
@Override
public void tell() {
// TODO Auto-generated method stub
System.out.println("通過語音打電話");
}
}
主函數(shù)
package com.xhouxiang;
public class initialmian {
public static void main(String[] args) {
// TODO Auto-generated method stub
CellPhone obj1=new CellPhone();
SmartPhone obj2=new SmartPhone();
obj1.message();
obj1.tell();
obj2.message();
obj2.tell();
}
}
5.接口圖形化分析

智能手機也可以玩游戲,Psp也可以玩游戲,PsP不能繼承TelPhone這個類,只有寫一個接口讓他們各自實現(xiàn)。
接口
package com.xhouxiang;
public interface InterPlaygame {
public void playgame();
}
智能手機玩游戲
package com.xhouxiang;
public class SmartPhone extends TelePhone implements InterPlaygame {
@Override
public void message() {
// TODO Auto-generated method stub
System.out.println("通過語音發(fā)短信");
}
@Override
public void tell() {
// TODO Auto-generated method stub
System.out.println("通過語音打電話");
}
@Override
public void playgame() {
// TODO Auto-generated method stub
System.out.println("智能手機打游戲");
}
}