此次所有的讨論都是子類指派給父類時出現的情況。
靜态綁定:
在程式執行前方法已經被綁定,此時是由編譯器或者其他連結程式實作
1 Java中的方法隻有final ,static,private,構造方法是靜态綁定
2 所有的屬性都是靜态綁定。
動态綁定:
運作時根據具體對象的類型進行綁定
父類子類
子類指派給父類時,
1 父類中有聲明的方法才可以調用,父類中未聲明,子類中聲明無法調用子類方法。(規定)
2 父類子類都聲明的方法,在父類中無privatestatic final修飾或者不是父類的構造函數,調用子類的方法。(無修飾,調子類)(動态綁定)
3 父類子類都聲明的方法,在父類中被privatestatic final修飾或者是父類的構造函數,則調用父類的方法。(有修飾,調父類)(靜态綁定)
4 父類子類都聲明的屬性,調用父類的屬性。(全聲明,調父類)(靜态綁定)
5 父類中聲明的屬性,子類未聲明,則調用父類的屬性。
子類指派給父類時
對于方法來說,隻要有子類,就要用子類的,子類沒有時,就直接調用父類的方法。
父類animal:
package Com;
public class Animal {
public String name; // 父類子類中同時聲明,調用父類(靜态綁定)
public String Color;
// 構造器 靜态綁定
public Animal()
{
this("Animal","未賦色");
}
public Animal(String name,String Color)
{
this.name=name;
this.Color=Color;
System.out.println("Animal.... 構造器");
}
// static 修飾 靜态綁定
public static int age;// 屬于類(靜态綁定)
public static void agefuc() // 靜态方法(靜态綁定)
{
System.out.println("類的年齡是"+age);
}
//final 修飾 靜态綁定
public final int gogo=111;// 常量 不能更改 屬于父類
public final void go() // 常量函數 意味着該方法不能被重寫
{
System.out.println("常量函數!!!");
}
// private 隻能類中調用 靜态綁定
private int pp=123;
private int getPP()
{
return 222;
}
//普通方法 子類指派給父類時,調用的是子類的方法
public void howl()
{
System.out.println(name+" .....xxxxx.....");
}
public void showColor()
{
System.out.println(Color+"....父類....");
}
//子類中無此方法,則調用直接調用父類方法
public void msg()
{
}
}
子類Cat:
package Com;
public class Cat extends Animal{
public String name; // 父類中也有name屬性,但由于是靜态綁定,是以調用子類howl,無法得到name的值,輸出為null
// Cat子類中沒有Color屬性,直接從父類繼承過來。
// 構造器為靜态綁定,子類new一個新的對象指派給父類時,實際調用的是父類的構造器(String name,String Color) 而不是Cat(String name,String Color)
public Cat()
{
super(); // 可省略
}
public Cat(String name,String Color)
{
this.name=name;
this.Color=Color;
System.out.println("Cat.....構造器");
}
public void howl()
{
System.out.println(name+"..... miaomiao!!!");
}
public void showColor()
{
System.out.println(Color+"....子類....");
}
}
Main:
package Com;
public class main {
public static void main(String args[]) {
//此次所有的讨論都是子類指派給父類時出現的情況。
Animal a = new Cat(); // 編譯期時,a被認為是Animal類型的,運作期時,a被認為是Cat();
a.name="xiaomao";
a.Color="白色";
//(動态綁定) 調用子類的方法時,子類屬性值為最高優先級的屬性值(本類屬性優先級>父類屬性優先級)
a.howl(); // 調用的是子類的方法,但由于父類子類中都有name屬性,實際調用父類屬性(靜态綁定),子類不指派,子類輸出自己的name屬性時,為NULL
a.showColor(); //調用的子類的方法,隻有在父類中聲明color,子類輸出父類的color 為”白色“。
// 常量方法 (靜态綁定)
a.go();
Animal.age=12;// 屬于類,不需要new對象,可直接調用。(靜态綁定)
Animal.agefuc();
}
}
結果:
從結果可以看出 構造器為靜态綁定
name屬性為父類子類都聲明的,調用的是父類的屬性(靜态綁定),子類的方法 (動态綁定)
color屬性是父類聲明的,子類調用時直接接收父類的“白色”值
常量函數為靜态綁定
static 修飾的是靜态綁定
小結:
靜态綁定和動态綁定的實質就是子類指派給父類時,誰被調用的情況。靜态綁定是在連結時被調用,而動态綁定是程式跑起來時被調用。