抽象類:若是一個類中包含有抽象方法,或這個類使用abstract關鍵字修飾,則稱這個類是抽象類。 抽象方法是什麼呢?抽象方法就是指用abstract關鍵字修飾的方法。 須要注意的是:抽象類不必定必須包含抽象方法,而若是一個類中有抽象方法,這個類必須是抽象類。java
package com.developlee.abstractInterface; /** * @TODO // * @Author Lensen * @Date 2018/7/21 * @Description 球類抽象類 */ public abstract class Ball { private String ballName; public Integer radius; public void circle(){ System.out.println("爸爸是圓的,因此兒子也是圓的"); } public abstract double volume(); }
包含抽象方法的類稱爲抽象類,但並不意味着抽象類中只能有抽象方法,它和普通類同樣,一樣能夠擁有成員變量和普通的成員方法。注意,抽象類和普通類的主要有三點區別:.net
- 1)抽象方法必須爲public或者protected(由於若是爲private,則不能被子類繼承,子類便沒法實現該方法),缺省狀況下默認爲public。
- 2)抽象類不能用來建立對象;
- 3)若是一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。若是子類沒有實現父類的抽象方法,則必須將子類也定義爲爲abstract類。
接口能夠含有變量和方法,接口中的變量會被隱式地指定爲public static final變量(而且只能是public static final變量,用private修飾會報編譯錯誤),而方法會被隱式地指定爲public abstract方法且只能是public abstract方法(用其餘關鍵字,好比private、protected、static、 final等修飾會報編譯錯誤),而且接口中全部的方法不能有具體的實現,也就是說,接口中的方法必須都是抽象方法。接口通常都是用interface修飾,接口是抽象方法的集合。若是一個類實現了某個接口,那麼它就繼承了這個接口的抽象方法。code
public interface Sharp { }
繼承某個接口對象
public class A implements Sharp { }
- 子類用extends關鍵字來繼承抽象類,用implements關鍵字來實現接口。
- 抽象類能夠有構造器,而接口類沒有 抽象類能夠提供成員方法的實現細節,
而接口中只能存在public abstract 方法(JDK1.8後,接口類新增了一些特性,能夠有default和static方法。參閱個人另外一篇文章:Java8新特性之接口)- 抽象類中的成員變量能夠是各類類型的,而接口中的成員變量只能是public static final類型的
- 接口中不能含有靜態代碼塊以及靜態方法,而抽象類能夠有靜態代碼塊和靜態方法
- 一個類只能繼承一個抽象類,而一個類卻能夠實現多個接口。
- 抽象類是對對象的屬性,行爲抽象,而接口類是對對象的行爲抽象。繼承表達的是某個對象是否是屬於某個類(如戰鬥機是否屬於飛機類,麻雀是否屬於鳥類), 而接口表達的是某個對象有沒有(能不能幹某些事)某種行爲(如鳥,飛機都是能飛的,但它們飛的實現方式不一樣)
- 若是你擁有一些方法而且想讓它們中的一些有默認實現,那麼就使用抽象類。
- 若是你想實現多重繼承,那麼你必須使用接口。因爲Java不支持多繼承,子類不可以繼承多個類,但能夠實現多個接口。所以你就可使用接口來解決它。
- 若是基本功能在不斷改變,那麼就須要使用抽象類。若是不斷改變基本功能而且使用接口,那麼就須要改變全部實現了該接口的類。