黑馬程序員------面向對象(No.6)(接口、多態)

---------------------- ASP.Net+Android+IO開發S.Net培訓、期待與您交流! ---------------------- 

 

微笑接口

格式:interface{ }

接口中的成員修飾符是固定的。

1.成員常量:public static final

2.成員函數:public abstract

接口的出現,將“多繼承”通過另一種形式體現出來,即“多實現”。

 

接口:是不可以創建對象的,因爲有抽象方法。
需要被子類實現,子類對接口中的抽象方法全部重寫後,子類纔可以實例化。否則,子類是一個抽象類

/*
接口:是不可以創建對象的,因爲有抽象方法。
需要被子類實現,子類對接口中的抽象方法全部重寫後,子類纔可以實例化。
否則,子類是一個抽象類
*/
interface Inter{
	public static final int NUM = 3;
	public abstract void show();
}
class Test implements Inter{
	public void show(){}
}
class InterfaceDemo{
	public static void main(String[] args){
		Test t = new Test();
		System.out.println(t.NUM);//輸出3
		System.out.println(Test.NUM);//輸出3
		System.out.println(Inter.NUM);//輸出3
	}
}

編譯後產生三個.class文件:Inter.class、Test.class、InterfaceDemo.class

interface A{
	void methodA();
}
interface B{
	void methodB();
}
//可以多繼承 只在接口與接口之間
interface C extends A,B{
	void methodC();
}
class D implements C{
	public void methodA(){}
	public void methodB(){}
	public void methodC(){}
}


接口的特點:

1.接口是對外暴露的規則。

2.接口是程序的功能擴展。

3.接口可以用來多實現。

4.類與接口之間是實現關係,而且類可以繼承一個類的同時實現多個接口。

5.接口與接口之間可以有繼承關係。

abstract class Student{
	//每個學生都有自己學習功能的實現,所以定義成抽象方法。由子類實現該功能
	abstract void study();
	//每個學生都有相同的sleep功能。
	void sleep(){
		System.out.println("sleep");
	}
}
//擴展功能要放在接口中,要擴展這個功能,就實現這個接口。
interface Smoking{
	void smoke();
}
//實現了Smoking接口。具有Smoking功能。
class ZhangSan extends Student implements Smoking{
	void study(){}
	public void smoke(){}
}
//沒有實現Smoking功能。
class LiSi extends Student{
	void study(){}
}

 

微笑多態

 

多態:可以理解爲事物存在的多種體現形態。

人:男人、女人;

動物:貓、狗;

貓 x = new 貓( );

動物 x = new 貓( );

 

1.多態的體現

父類引用指向子類對象(父類的引用可以接收自己的子類對象)。

2.多態的前提

必須是類與類之間有關係。要麼繼承,要麼實現。

通常還有一個前提,就是存在覆蓋(重寫)。

3.多態的好處

多態的出現大大的提高了程序的擴展性。

4.多態的弊端

提高了擴展性,但是隻能使用父類的引用訪問父類中的成員。

abstract class Animal{
	public abstract void eat();
}
class Cat extends Animal{
	public void eat(){
		System.out.println("吃魚");
	}
	public void catchMouse(){
		System.out.println("抓老鼠");
	}
}
class Dog extends Animal{
	public void eat(){
		System.out.println("啃骨頭");
	}
	public void kanJia(){
		System.out.println("看家");
	}
}
class DuoTaiDemo{
	public static void main(String[] args){
		//父類引用指向子類對象(父類的引用可以接收自己的子類對象)(類型提升)(向上轉型)
		Animal a = new Cat();
		a.eat();
		//如果想要調用貓的特有方法時,如何操作?
		//強制向下轉型
		Cat c = (Cat)a;
		c.catchMouse();//輸出  抓老鼠

		//這種方式錯誤,這種方式就是將父類對象轉成子類類型。
		//我們能轉換的是父類應用指向了自己的子類對象事,該應用可以被提升,也可以被強制轉換。
		//多態自始自終都是子類對象在做着變化。
		//Animal a1 = new Animal();  同時抽象類也不能直接被實例化
		//Cat c1 = (Cat)a1;

		fun(new Dog());
		fun(new Cat());
	}
	public static void fun(Animal a){
		a.eat();
		if(a instanceof Cat){
			Cat c = (Cat)a;
			c.catchMouse();
		}
		if(a instanceof Dog){
			Dog d = (Dog)a;
			d.kanJia();
		}
	}
}

 

我們能轉換的是父類應用指向了自己的子類對象事,該應用可以被提升,也可以被強制轉換。多態自始自終都是子類對象在做着變化。

5.多態的應用

/*
基礎班學生:
	學習、睡覺
高級版學生:
	學習、睡覺
*/
abstract class Student{
	public abstract void study();
	public void sleep(){
		System.out.println("躺着睡");
	}
}
//將操作Student的方法封裝成類
class DoStudent
{
	public void doSome(Student stu){
		stu.study();
		stu.sleep();
	}
}
class BaseStudent extends Student{
	public void study(){
		System.out.println("base study");
	}
	public void sleep(){
		System.out.println("坐着睡");
	}
}
class AdvStudent extends Student{
	public void study(){
		System.out.println("adv study");
	}
}
class DuoTaiDemo{
	public static void main(String[] args){
		//BaseStudent bs = new BaseStudent();
		//bs.sleep();
		//bs.study();
		//AdvStudent as = new AdvStudent();
		//as.sleep();
		//as.study();
		DoStudent ds = new DoStudent();
		ds.doSome(new BaseStudent());
		ds.doSome(new AdvStudent());
	}
}


6.多態的出現代碼中的特點(多態使用注意事項)

在編譯時期,參閱引用型變量所屬類中是否有調用的方法。如果有,編譯通過,如果沒有則編譯失敗。

在運行時期,參閱對象所屬的類中是否有調用方法。

簡單總結就是:成員函數在多態調用時,編譯看左邊,運行看右邊。

 

在多態中,成員變量的特點:

無論編譯和運行,都參考左邊(引用型變量所屬的類)。

 

在多態中,靜態成員的特點:

無論編譯和運行,都參考左邊。

(視頻出處:傳智播客畢向東Java基礎視頻教程-day08-05-面向對象(多態中成員的特點).avi)

 

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ---------------------- 

詳情請查看:http://edu.csdn.net

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章