多態
1.什麼是多態?
某一個事物,在不同時刻表現出來的不同狀態。
父 f = new 子();
2.多態的前提?
- 要有繼承關係。
- 要有方法重寫。 其實沒有也是可以的,但是如果沒有這個就沒有意義。
- 要有父類引用指向子類對象。
3.多態中的成員訪問特點?
- 成員變量
編譯看左邊,運行看左邊。 - 構造方法
創建子類對象的時候,會訪問父類的構造方法,對父類的數據進行初始化。 - 成員方法
編譯看左邊,運行看右邊。 - 靜態方法
編譯看左邊,運行看左邊。
4.多態的好處?
提高了代碼的維護性(繼承保證)
提高了代碼的擴展性(由多態保證)
5.多態的弊端?
不能使用子類特有的功能
注意:如果需要使用子類
可以把父類的引用強制轉換爲子類的引用。(向下轉型)
舉例:
public class MyTest {
public static void main(String[] args) {
Animal an = new Dog();
an.eat();
Dog dog=(dog) Animal;
dog.lookdoor();
an=new Cat();
an.eat();
}
}
class Animal{
public void eat(){System.out.println("吃飯");}
}
class Cat extends Animal{
@Override
public void eat() {System.out.println("吃小魚乾");}
}
class Dog extends Animal{
@Override
public void eat() {System.out.println("狗吃骨頭");}
public void lookdoor(){System.out.println("狗看門");}
}
抽象類
1.什麼是抽象類?
在Java中,一個沒有方法體的方法應該定義爲抽象方法,而類中如果有抽象方法,該類必須定義爲抽象類。
2.抽象類的特點?
- 抽象類和抽象方法必須用abstract關鍵字修飾
抽象類格式: abstract class 類名 {}
抽象方法格式: public abstract void eat();
- 抽象類不一定有抽象方法,有抽象方法的類一定是抽象類
- 抽象類中可以有構造方法,抽象類不能進行實例化
- 抽象類的子類,要麼是抽象類,要麼重寫抽象類中的所有抽象方法。
3.抽象類的成員特點?
- 成員變量:既可以是變量,也可以是常量。
- 構造方法:有。
用於子類訪問父類數據的初始化。 - 成員方法:既可以是抽象的,也可以是非抽象的。
接口
1.什麼是接口?
爲了體現事物功能的擴展性,Java中就提供了接口來定義這些額外功能,並不給出具體實現。
2.接口的特點?
- 接口用關鍵字interface表示
interface 接口名 {}
- 類實現接口用implements表示
class 類名 implements 接口名 {}
3.接口成員特點?
- 成員變量;只能是常量,並且是靜態的。
默認修飾符:public static final - 構造方法:接口沒有構造方法。
- 成員方法:只能是抽象方法。
默認修飾符:public abstract
4.類與類,類與接口,接口與接口的關係?
a:類與類:
繼承關係,只能單繼承,可以多層繼承。
b:類與接口:
實現關係,可以單實現,也可以多實現。
並且還可以在繼承一個類的同時實現多個接口。
c:接口與接口:
繼承關係,可以單繼承,也可以多繼承。
5.抽象類和接口的區別?
- 成員區別
抽象類:
成員變量:可以變量,也可以常量
構造方法:有
成員方法:可以抽象,也可以非抽象
接口:
成員變量:只可以常量
成員方法:只可以抽象 - 關係區別
類與類
繼承,單繼承
類與接口
實現,單實現,多實現
接口與接口
繼承,單繼承,多繼承 - 設計理念區別
抽象類 被繼承體現的是:”is a”的關係。 抽象類中定義的是該繼承體系的共性功能。
接口 被實現體現的是:”like a”的關係。 接口中定義的是該繼承體系的擴展功能。
舉例:
public class MyTest {
public static void main(String[] args) {
}
}
class Cat implements Fireinterface {
public void eat() {
}
@Override
public void fire() {
System.out.println("貓學會了鑽火圈");
}
}
class Dog implements Fireinterface{
@Override
public void fire() {
System.out.println("狗學會了鑽火圈");
}
}
public interface Fireinterface {
public abstract void fire();
}
``