1. 程式人生 > >Java第十天學習筆記~面向物件(介面應用、多型)

Java第十天學習筆記~面向物件(介面應用、多型)

介面的應用

暴露的規則   使用規則   實現規則

這些裝置和電腦的耦合性降低了

interface USB //暴露的 規則
{
	public void open();
	public void close();
}
class BookPC
{
	public static void main(String[] args)
	{
		useUSB(new UPan());
		useUSB(new UsbMouse());//功能拓展了
	}
	//使用規則
	public static void useUSB(USB u)//介面型別的引用,用於接收(指向)介面的子類物件 
	{
		u.open();
		u.close();
	}
}
//一年以後----------
//實現規則


//這些裝置和電腦的耦合性降低了
class UPan implements USB
{
	public void open()
	{
		System.out.println("upan open");
	}
	public void close()
	{
		System.out.println("upan close");
	}
}
class UsbMouse implements USB
{
	public void open()
	{
		System.out.println("Mouse open");
	}
	public void close()
	{
		System.out.println("Mouseclose");
	}
}

多型

定義:某一類事物的多種存在形態。

例:動物中貓,狗。

貓這個物件對應的型別是貓型別:貓 x = new 貓();

同時貓也是動物中的一種,也可以把貓稱為動物:動物 y = new 貓();

動物是貓和狗具體事物中抽取出來的父型別。

父型別引用指向了子類物件。

多型性簡單說就是一個物件對應著不同型別。

一個多型對應著不同型別   

多型在程式碼中的體現

多型
    好處: 提高了程式碼的擴充套件性,前期定義的程式碼可以使用後期的內容
    弊端:前期定義的內容不能使用(呼叫)後期子類的特有內容
    前提:
        1,   必須有關係,繼承,實現
        2,有覆蓋

/*多型
	好處 提高了程式碼的擴充套件性,前期定義的程式碼可以使用後期的內容
	弊端:前期定義的內容不能使用(呼叫)後期子類的特有內容
	前提:
		1,必須有關係,繼承,實現
		2,有覆蓋
*/
abstract class Animal
{
	abstract void eat();
}
class Dog extend Animal
{
	void eat()
	{
		System.out.println("啃骨頭");
	}
	void lookHome()
	{
		System.out.println("看家");
	}
}
class Cat extend Animal
{
	void eat()
	{
		System.out.println("吃魚");
	}
}
class DuoTaiDemo
{
	public static void main(String[] args)
	{
	//	Cat c=new Cat();
	//	Dog d=new Dog();
	//	method(new dog());
	Animal a=new Cat();/* 自動型別提升,貓物件提升了動物型別,但是特有功能無法訪問
						作用就是限制對特有功能的訪問
						專業講:向上轉型
	
	*/
	a.eat;
	//如果還想用具體動物貓的特有功能
	//你可以將該物件進行向下轉型
	Cat.c=(Cat)a;//向下轉型的目的是為了使用子類中的特有方法
	c.eat();
	c.catchMouse();
	//注意:對於轉型,自始至終都是子類物件在做著型別的變化
	}
	public static void method(Animal a)
	{
		a.eat;
	}
}

注意:

instanceof :用於判斷物件的具體型別,只能用於引用資料型別判斷,通常在向下轉型前用於健壯性的判斷。

多型時,成員的特點

1,成員變數

    編譯時:參考引用型變數所屬的類中的是否有呼叫的成員變數,有,編譯通過,沒有,編譯失敗

    執行時,參考引用型變數所屬的類中的是否有呼叫的成員變數,並執行該所屬類中的成員變數

    簡單說:編譯和執行都參考等號左邊

2,成員函式(非靜態)

    編譯時:參考引用型變數所屬的類中是否有呼叫的函式。有,編譯通過,沒有,編譯失敗

    執行時:參考的是物件所屬的類中是否有呼叫的函式

    簡單的說:編譯看左邊,執行看右邊

3,靜態函式

    編譯時:參考引用型變數所屬的類中的是否有呼叫的靜態方法

    執行時:參考引用型變數所屬的類中的是否有呼叫的靜態方法

    簡單說,編譯和執行都看左邊

    其實對於靜態方法,是不需要物件的,直接用類名呼叫

/*多型時,成員的特點
1,成員變數
	編譯時:參考引用型變數所屬的類中的是否有呼叫的成員變數,有,編譯通過,沒有,編譯失敗
	執行時,參考引用型變數所屬的類中的是否有呼叫的成員變數,並執行該所屬類中的成員變數
	簡單說:編譯和執行都參考等號左邊
2,成員函式(非靜態)
	編譯時:參考引用型變數所屬的類中是否有呼叫的函式。有,編譯通過,沒有,編譯失敗
	執行時:參考的是物件所屬的類中是否有呼叫的函式
	簡單的說:編譯看左邊,執行看右邊
3,靜態函式
	編譯時:參考引用型變數所屬的類中的是否有呼叫的靜態方法
	執行時:參考引用型變數所屬的類中的是否有呼叫的靜態方法
	簡單說,編譯和執行都看左邊
	其實對於靜態方法,是不需要物件的,直接用類名呼叫
*/
class Fu
{
//	int num=3;
	void show()
	{
		System.out.println("fu show");
	}
	static void method()
	{
		System.out.println("fu static method");
	}
}
class Zi extends Fu
{
//	int num=4;
	void show()
	{
		System.out.println("zi show");
	}
	static void method()
	{
		System.out.println("zi static method");
	}
}
class DuoTaiDemo3
{
	public static void main(String[] args)
	{
		Fu f=new Zi();
		f.method();
		//f.show();
		//System.out.println(f.num);
	}
}