多態(tài): 父類引用類型變量指向了子類的對象或者是接口的引用類型變量指向了接口實(shí)現(xiàn)類的對象。 (一個(gè)對象具備多種形態(tài))
多態(tài)的前提: 必須存在繼承或者實(shí)現(xiàn)關(guān)系。
多態(tài)要注意的細(xì)節(jié):
1. 多態(tài)情況下,子父類存在著同名的成員變量時(shí)鬓催,默認(rèn)會(huì)訪問父類的成員變量抬纸。
2. 多態(tài)情況下,子父類存在著同名的非靜態(tài)函數(shù)時(shí)向胡,默認(rèn)是訪問子類的成員函數(shù)。
3. 多態(tài)情況下惊完,子父類存在著同名的靜態(tài)函數(shù)時(shí)僵芹,默認(rèn)是訪問父類的成員函數(shù)。
4. 多態(tài)情況下小槐,不能訪問子類特有的成員拇派。
總結(jié):
多態(tài)情況下,子父類存在同名的成員時(shí)凿跳, 默認(rèn)都會(huì)訪問父類的成員.只有存在非靜態(tài)的
同名函數(shù)時(shí)件豌,才是訪問子類的成員。
編譯看左邊控嗜,運(yùn)行不一定看 右邊
編譯看左邊: java編譯器在編譯的時(shí)候茧彤,會(huì)檢查引用類型變量所屬的類是否具備指定的成員,如果不具備疆栏,編譯報(bào)錯(cuò)曾掂。
多態(tài)的應(yīng)用場景
abstract class Animal{
String name;
String color;
static int age = 10;
public Animal(String name,String color){
this.name = name;
this.color = color;
}
public abstract void run();
public static void sleep(){
System.out.println("動(dòng)物睡覺...");
}
}
//狗
class Dog extends Animal{
static int age = 20;
public Dog(String name,String color){
super(name,color);
}
public void run(){
System.out.println(name+"四條腿跑...");
}
public static void sleep(){
System.out.println("狗在睡覺...");
}
//狗特有的方法
public void bite(){
System.out.println(name+"咬人");
}
}
class Demo
{
public static void main(String[] args)
{
Dog d = new Dog("沙皮","棕色");
d.run();
Animal a = new Dog("哈士奇","白色"); //多態(tài) 父類的引用類型變量指向了子類的對象。
//System.out.println("年齡:"+ a.age);
//a.sleep();
a.bite();
}
}