---------------------- 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