天天看點

Java語言基礎之靜态綁定and動态綁定

此次所有的讨論都是子類指派給父類時出現的情況。

靜态綁定:

在程式執行前方法已經被綁定,此時是由編譯器或者其他連結程式實作 

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();
		
		
	}
  
}


 
           

結果:

Java語言基礎之靜态綁定and動态綁定

從結果可以看出 構造器為靜态綁定

name屬性為父類子類都聲明的,調用的是父類的屬性(靜态綁定),子類的方法 (動态綁定)

color屬性是父類聲明的,子類調用時直接接收父類的“白色”值

常量函數為靜态綁定

static 修飾的是靜态綁定

小結:

靜态綁定和動态綁定的實質就是子類指派給父類時,誰被調用的情況。靜态綁定是在連結時被調用,而動态綁定是程式跑起來時被調用。

繼續閱讀