一、抽象類
(1)什麼是抽象類?
類和類之間有共同特徵,將這些具有共同特徵的類再進一步抽象形成抽象類,由於類本身是不存在的,所以抽象類無法創建對象。
(2)抽象類屬於什麼類型?
抽象類屬於引用數據類型。
(3)抽象類怎麼定義?
語法:
[修飾符列表] abstract class 類名{
類體;
}
(4)抽象類的子類還可以是抽象類。
(5)抽象類雖然無法實例化,但抽象類還是有構造方法的。
(6)抽象類關聯到抽象方法的概念,什麼是抽象方法呢?
抽象方法是表示沒有實現的方法,沒有方法體的方法。例如:
Public abstract void doSome();
(7)抽象方法特點:
(a)沒有方法體,以分號結尾。
(b)前面修飾符列表中有abstract關鍵字。
(6))抽象類可以沒有抽象方法,但抽象方法一定出現抽象類中。
二、非抽象方法繼承抽象類必須將抽象方法實現(五顆星)
Bird類是繼承了Animal的,而且Animal是一個抽象類,裏面還有抽象方法,如果是Bird繼承了Animal,會把Animal裏面的方法都會繼承過來,但是又由於抽象方法必須在抽象類中,而不能在普通類中,所以必須要把抽象方法進行重寫。
結論:一個非抽象的類繼承抽象類,必須要將抽象方法進行覆蓋和重寫。
Animal a = new Bird();//向上轉型。
這就是面向抽象編程。以後就調用a.xxx,a的類型時Animal,Animal是抽象的,面向抽象編程,不要面向具體編程,降低程序的耦合度,提高程序的擴展力。
問題:Java語言中凡是沒有方法體的方法都是抽象方法?
不對,例如:
public native int hashCode();
這個方法底層調用了C++寫的動態鏈接庫程序。
三、接口
(1)接口也是一種引用數據類型
(2)接口是完成抽象的(抽象類是半抽象),或者接口是特殊的抽象類。
(3)接口怎麼定義:語法是什麼?
[修飾符列表] interface 接口名{
}
(4)接口編譯之後也是.class字節碼文件。
(5)接口支持多繼承
//定義接口
interface A{
}
//定義接口
interface B{
}
//定義接口
interface C extends A,B{
}
(6)接口中只包含兩部分內容:一部分是常量,一部分是抽象方法。
接口當中既然都是抽象方法,那麼在編寫代碼的時候,public abstract可以省略嗎?
可以的,因爲所有的方法都是Public abstract修飾的。
(7)接口中所有的元素都是public修飾的。
(8)
interface MyMath{
//常量
public static final double pI = 3.141592653589793 ;
}
這裏的public static final可以省略嗎?
可以的
double PI =3.14
所以在外面不能修改PI的值。
(9)類和類直接叫繼承,類和接口之間叫做實現。
這裏的實現可以看做“繼承”
繼承使用extends關鍵字完成
實現使用implements關鍵字完成。
(10)(特別重要)當一個非抽象的類實現接口的話,必須將接口中所有的抽象方法全部實現。(覆蓋,重寫)
(11)如果一個類實現了接口,裏面的方法需要全部的實現,並且方法修飾符只能更高,不能更低,更不能不寫。
(12)接口和接口之間支持多繼承,那麼一個類可以同時實現多個接口嗎?
//定義接口
interface A{
void m1();
}
//定義接口
interface B{
void m2();
}
//定義接口
interface C {
void m3();
}
class D implements A,B,C{
//實現A接口的m1()
public void m1(){
}
//實現B接口中的m2()
public void m2(){
}
//實現C接口中的m3()
public void m3(){
}
}
重點:一個類可以同時實現多個接口,彌補了java中只支持單繼承。
四、implements和extends同時出現
(1)繼承和實現都存在的話,代碼怎麼寫?
Extends 關鍵字在前,implements 關鍵字在後
class Animal{
}
interface Flyable{
void fly();
}
class Cat extends Animal implements Flyable{
public void fly(){
System.out.println("飛貓");
}
}
public class Test{
public static void main(String [] args){
//創建對象
Flyable f = new new Cat();//多態
f.fly();
}
}
五、接口在開發中的作用
(1)接口在開發中的作用類似於多態在開發中的作用。
多態:面向抽象編程,不要面向具體編程,降低程序的耦合度,提高程序的擴展力。
(2)接口是不是完全抽象的?是
而我們以後正好要求,面向抽象編程,面向抽象編程這句話以後可以改爲面向接口編程。有了接口就有了可插拔,表示擴展能力強,不是焊接了。
接口可以解耦合,解開的是誰和誰的耦合
任何一個接口都有調用者和實現者。
接口可以將調用者和實現這解耦合。
調用者面向接口調用。
實現者面向接口編寫實現。
下面用代碼體現:
publicclassTest{
publicstaticvoidmain(String[]args){
//實例化廚師
ChinaCookeryinpin=newChinaCooker();
JanpanCookerjunshui=newJanpanCooker();
//實例化顧客
Customerxiaowei=newCustomer(yinpin);
//顧客想吃中國菜
xiaowei.order();
}
}
//菜單接口
interfaceMenu{
voidCaihua();
voidChicken();
}
//顧客
classCustomer{
MenuM;
publicCustomer(){
}
publicCustomer(Menum){
M=m;
}
publicvoidorder(){
M.Caihua();
M.Chicken();
}
}
//中國廚師
classChinaCookerimplementsMenu{
@Override
publicvoidCaihua(){
System.out.println("中國廚師做的菜花");
}
@Override
publicvoidChicken(){
System.out.println("中國廚師做的雞塊");
}
}
//日本廚師
classJanpanCookerimplementsMenu{
@Override
publicvoidCaihua(){
System.out.println("日本廚師做的菜花");
}
@Override
publicvoidChicken(){
System.out.println("日本廚師做的雞塊");
}
}
六、接口和抽象類的區別
(1)定義語法上不同
(2)抽象類是半抽象,而接口是完全抽象的,抽象類裏面有構造方法,而接口中只能有常量和抽象方法。
(3)抽象列不支持多繼承,而接口支持多繼承。
(4)接口中所有的元素都是public修飾的,抽象方法是public abstract修飾的,常量是public static final修飾的。
(5)接口和抽象類都能實現多態(父類型的引用指向子類型的對象)
總結:以前總感覺抽象類和接口都差不多,但是發現他們之間的區別還是挺大的,接口屬於完全抽象,抽象類屬於半抽象,所以這也導致了以後在開發中接口運用的會比抽象類要多的多,而且我感覺更有意思的是接口裏面的常量居然是可以省略了public static final的方法是省略了public abstract的,這要是不知道,以後可能會把接口中的常量認爲是變量,把方法認爲是普通方法了吧。
Java如何在代碼體現面向對象和多態(2)-is a(繼承)、has a (關聯)、like a(實現)(什麼時候在類中定義另一個類?)