Java第十天學習筆記~面向物件(介面應用、多型)
阿新 • • 發佈:2018-12-02
介面的應用
暴露的規則 使用規則 實現規則
這些裝置和電腦的耦合性降低了
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);
}
}