黑馬程序員----java面向對象03(接口、多態)

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

一.接口概述

 * 接口概述:
 * 接口的成員修飾都是固定的
 * 屬性:public static final
 * 方法:public abstract
 *
 *
 * 1、接口與接口之間可以多繼承,因爲沒有方法體,不衝突
 * 2、一個類可以實現多個接口
 * 3、一個類可以繼承另一個類同時又實現多個接口,因爲沒有方法體,不衝突
 * */

代碼示例

public class Interface {
	public static void main(String[] args) {
		ImpTnter it = new ImpTnter();
		System.out.println(it.NUM);   //對象調用
		System.out.println(ImpTnter.NUM);   //類名調用
		System.out.println(Inter.NUM);   //接口名調用
	}
}

//interface 接口名
interface Inter{
	public static final int NUM=3;
	public abstract void show();
}

class ImpTnter implements Inter{
	public void show(){      //注意public權限
		System.out.println("。。。");
	}
}

interface A{
	
}

interface B extends A{
	
}

interface C extends A,B{    //例1
	
}

class A_ implements A,B{
	
}

class B_ extends A_ implements A,B,C{    //例3
	
}

 

 

 

二.模板方法(獲取一段程序運行的時間)

* 模板方法
 * 需求:獲取一段程序運行的時間
 * 實現:程序運行前的時間減去運行後的時間差即可

代碼示例:

public class Template_Method {
	public static void main(String[] args) {
		GetTime1 gt1 = new GetTime1();
		gt1.time();    //此時調用的就是已經本類中已經複寫過的方法
	}
}

abstract class GetTime{
	//打印出時間差的功能
	final void time(){    //final修飾後,此方法不能被複寫
		long start = System.currentTimeMillis();   //運行前的時間
		method();
		long end = System.currentTimeMillis();   //運行後的時間
		System.out.println("程序運行的時間爲:"+(end-start));
	}
	//程序運行過程
	abstract void method();  //不需要明確功能內容,所以抽象出功能聲明即可
}

//繼承了GetTime類,複寫了method方法
class GetTime1 extends GetTime {
	void method(){
		for(int i = 0;i<6000;i++){
			System.out.println("i");
		}
	}
}

 

 

 

三.多態概述

* 多態的概念:事物的多種體現形式
 *
 * 例如:
 * 貓 a = new 貓();
 * 貓也是屬於動物
 * 動物 a = new 貓();
 *
 * 思路:
 * 定義了一個動物類,此類擁有eat方法,然後貓類、狗類等等繼承了動物類
 * 此時如果需要調用貓類喫魚的方法,必須創建貓類對象Cat c= new Cat();狗類似
 * 如果有很多貓,就需要多次調用eat方法,這樣代碼重複使用了,所以把eat方法封裝起來
 * 如果由很多動物,就需要定義若干個show方法,這樣代碼又重複使用了,所以把show方法的參數類型改成Animal
 *
 *
 * 1、多態的體現
 *  父類的引用指向自己的子類對象;父類的引用也可以接收自己的子類對象
 * 2、多態的前提
 *  父類和子類之間存在關係,要麼繼承,要麼實現
 * 3、多態的好處
 *  提高了代碼的擴展性,這樣以後有新動物產生了直接調用show方法就可以喫東西
 * 4、多態的弊端
 *  只能使用父類的引用訪問父類存在的成員,而父類中沒有定義的就不能夠這樣訪問
 * 5、多態的應用
 * */

代碼示例:

public class DuoTai_Demo {
	public static void main(String[] args) {
//		Cat c = new Cat();
//		c.eat();
//		
		Animal a = new Cat();   //例1,父類的引用指向自己的子類對象
		
//		Cat c1 = new Cat();
//		c1.eat();
		show(new Cat());
		show(new Cat());
		show(new Dog());
	}
	public static void show(Animal a){
		a.eat();
	}
}


/*
//動物類
abstract class Animal{
	public abstract void eat(); 
}

//貓類
class Cat extends Animal{
	public void eat(){
		System.out.println("喫魚");
	}
	void shangshu(){
		System.out.println("上樹");
	}
}

//狗類
class Dog extends Animal{
	public void eat(){
		System.out.println("啃骨頭");
	}
	void kanjia(){
		System.out.println("看家");
	}
}
*/

 

 

四.多態中非靜態成員函數的特點

*編譯時期,是參閱的引用類型變量所屬的類是否有此函數,如果由,編譯通過,反之編譯失敗
 *運行時期,是參閱的對象所屬的函數是否有此函數,並運行此函數
 *
 *多態中靜態成員函數的特點
 *編譯時期和運行時期都參閱的引用類型變量所屬的類是否有此函數,並運行此函數
 *
 *多態中成員變量的特點(非靜態和靜態一樣)
 *編譯時期編譯時期和運行時期都參閱的引用類型變量所屬的類是否有此變量,並調用此變量
 *
 **/

代碼示例:

public class DuoTai_function {
	public static void main(String[] args) {
		Fu f = new Zi();
		f.show1();   //編譯時父類有,運行時子類也有,所以結果是子類的
		f.show2();   //編譯時父類有,因爲繼承,運行時子類也有,所以結果是子類的
		//f.show3();   //編譯時父類沒有,編譯不通過
	}
}

class Fu{
	void show1(){
		System.out.println("Fu show 1");
	}
	void show2(){
		System.out.println("Fu show 2");
	}
}

class Zi extends Fu{
	void show1(){
		System.out.println("Zi show 1");
	}
	void show3(){
		System.out.println("Zi show 3");
	}
}

 

 

 

六.轉型

* 思路:
 * 如果想要使用子類特有的方法時,該怎麼辦呢?
 * 1、因爲是父類的引用指向了子類的對象,所以把父類的引用強制轉換成子類類型
 * 2、然後用用此引用去調用子類特有的方法
 * 這樣的話出現了一個問題,如果傳入的不是貓,是狗,就會出現錯誤
 * 所以要加以判斷
 * 
 *
 * 注意:轉換的是父類的引用, 而父類的對象是不能夠被轉換成子類類型的
 *  !!!多態自始至終都是子類對象在做着變化
 * */
代碼示例:

public class DuoTai_zhuanxing {
	public static void main(String[] args) {
		/*
		 * 如果想要使用子類特有屬性時,該怎麼辦?
		 * 解決辦法:把父類的引用強制轉化爲子類類型
		 * */
//		Animal a = new Cat(); //父類的引用指向了子類對象;向上轉型
//		a.eat();
//		Cat c = (Cat)a;   // 類似:int a ; byte b = (byte) a;
//		c.shangshu();
		
		show(new Cat());
		show(new Dog());
		
	}
	public static void show(Animal a){   //向上轉型
		a.eat();
		if(a instanceof Cat){    //判斷a的引用所指向的類型是不是Cat
			Cat c = (Cat) a;    //向下轉型
			c.shangshu();
		}else if(a instanceof Dog){    //判斷a的引用所指向的類型是不是DOg
			Dog c = (Dog) a;
			c.kanjia();
		}
	}
}

//動物類
abstract class Animal{
	public abstract void eat(); 
}

//貓類
class Cat extends Animal{
	public void eat(){
		System.out.println("貓喫魚");
	}
	void shangshu(){
		System.out.println("貓上樹");
	}
}

//狗類
class Dog extends Animal{
	public void eat(){
		System.out.println("狗啃骨頭");
	}
	void kanjia(){
		System.out.println("狗看家");
	}
}

 

 

 

七.電腦主板運行示例

public class DuoTai_zhuban {
	public static void main(String[] args) {
		ZhuBan zb = new ZhuBan();
		zb.open();
		zb.usePCI(new Wk());
		zb.usePCI(new Sk());
	}
}

class ZhuBan{
	public void open(){
		System.out.println("zhuban open");
	}
	public void usePCI(PCI p){
		p.open();
		p.end();
	}
}

//PCT規範
interface PCI{
	public abstract void open();
	public abstract void end();
}

//網卡
class Wk implements PCI{
	public void open(){
		System.out.println("wangka open");
	}
	public void end(){
		System.out.println("wangka end");
	}
}

//聲卡
class Sk implements PCI{
	public void open(){
		System.out.println("shengka open");
	}
	public void end(){
		System.out.println("shengka end");
	}
}

 

 

 

八.Object


/*
 * 任何類的父類都直接或間接爲Object
 * */

public class Object_equals {
	public static void main(String[] args) {
	Demo d1 = new Demo(3);
	Demo d2 = new Demo(4);
	
//	Person p = new Person();
//	System.out.println(d1.equals(p));   //如果把p傳入進去
	
	//System.out.println(d1.equals(d2));
	//System.out.println(d1.compare(d2));
	System.out.println(d1.equals(d2));     //相當於:Object obj = d2;
	}
}

class Demo{     //extends Object 
	//	public boolean compare(Object obj){
//		return this.equals(obj);
//	}
	private int num;
	Demo(int num){
		this.num = num;
	}
	//複寫Object類中的equals方法
	public boolean equals(Object obj){   //Object obj = new Demo();
		//所以要加上判斷
		if(obj instanceof Demo){
			Demo d = (Demo)obj;    //向上轉型,把父類的引用轉爲子類類型
			return this.num == d.num;    //因爲父類中沒有num屬性,所以不能直接訪問,必須向上轉型
		}else{
			return false;   //如果對象不同型,比較值絕對不同
		}
	}
}

class Person{
	
}

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------詳細請查看:http://edu.csdn.net

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