java接口和抽象類的不一樣

一 從語義的角度選擇不一樣之處;html

      接口與抽象類在語義上區別主要在定義和使用格式上,下面分別介紹抽象類和接口的定義與使用:java

   1, 抽象類的定義和使用格式:ide

      在java語言中定義抽象類時,要在關鍵字class前面加上abstract,格式以下:學習

       abstract class class_name{this

        類體
spa

       }.net

      在java中定義完抽象類以後,咱們使用抽象類,同時子類只能繼承一個抽象類的父類(單繼承),繼承以後子類必須所有覆蓋父 類中的抽象方法;設計

      class sub_class_name extend parent_class_name{htm

      父類中的抽象方法;
對象

      }

       在使用抽象類是請注意一下幾點:

       在使用抽象類時須要注意幾點:

             一、抽象類不能被實例化,實例化的工做應該交由它的子類來完成,它只須要有一個引用便可。

         二、抽象方法必須由子類來進行重寫。

         三、只要包含一個抽象方法的抽象類,該方法必需要定義成抽象類,不論是否還包含有其餘方法。

         四、抽象類中能夠包含具體的方法,固然也能夠不包含抽象方法。

         五、子類中的抽象方法不能與父類的抽象方法同名。

         六、abstract不能與final並列修飾同一個類。

         七、abstract 不能與private、static、final或native並列修飾同一個方法。

    抽象類的舉例以下:

             需求:

                   假如咱們在開發一個系統時須要對員工進行建模,員工包含3個屬性;
                    姓名,工號以及工資,經理也是員工,除了含有員工的屬性外,另外還有一個;
                    獎金屬性,請使用繼承的思想設計除員工類和經理類,要求類中提供必要的方法進行屬性訪問

                    實現代碼:

                     abstract class Employmen{
    private String name;
    private int numid;
    private double slary;
    //初始化
    public Employmen(String name,int numid,double slary) {
        // TODO Auto-generated constructor stub
        this.name = name;
        this.numid = numid;
        this.slary = slary;
    }
    abstract void work();
    
}
/**
 * 注意:
 * 在聲明完屬性以後,子類繼承了父類中的方法和屬性;
 * 同時要對子類進行初始化;用構造方法
 * */
//普通員工要初始化
class WorkMan extends Employmen{

    //初始化屬性
    public WorkMan(String name, int numid, double slary) {
        super(name, numid, slary);
        // TODO Auto-generated constructor stub
    }

    @Override
    void work() {
        // TODO Auto-generated method stub
        System.out.println("--- --- 員工幹活");
    }
}//結束


//經理類
class ProjectManager extends Employmen{
    
    //初始化屬性
    public ProjectManager(String name, int numid, double slary,double reward) {
        super(name, numid, slary);
        this.reward = reward;
        // TODO Auto-generated constructor stub
    }

    private double reward;
    @Override
    void work() {
        // TODO Auto-generated method stub
        System.out.println("經理幹活 ----  ----  ");
    }
}//結束

   2, 接口的定義和使用方法:

       在java中使用關鍵字interface來定義接口,一個接口由變量的定義和方法的定義兩部分組成。定義格式以下:

       interface interface_name{

                 [public] [static] [final] 變量;

                 [public] [abstract] 方法;    

       }

       在java語言中接口經過實現的方式來使用接口,一個類能夠實現多個接口,使用格式以下:

       class class_name implement interface_name{

            實現接口的方法;

       }

      在使用接口時請注意一下幾點:

        一、個Interface的方全部法訪問權限自動被聲明爲public。確切的說只能爲public,固然你能夠顯示的聲明爲protected、private,可是編譯會出錯!

         二、接口中能夠定義「成員變量」,或者說是不可變的常量,由於接口中的「成員變量」會自動變爲爲public static final。能夠經過類命名直接訪問:ImplementClass.name。

         三、接口中不存在實現的方法。

        四、實現接口的非抽象類必需要實現該接口的全部方法。抽象類能夠不用實現。

         五、不能使用new操做符實例化一個接口,但能夠聲明一個接口變量,該變量必須引用(refer to)一個實現該接口的類的對象。可使用 instanceof 檢查一個對象是否實現了某個特定的接口。例如:if(anObject instanceof Comparable){}。

         六、在實現多接口的時候必定要避免方法名的重複。

   接口的舉例以下:

            例如:

             //抽象類
abstract class Student{
    abstract void study();
    void sleep(){
        System.out.println("睡覺");
    }
}//end

//接口
interface Beat{
    public abstract void beatman();
    public abstract void goodMouth();
    
}//end


//P類
 class P extends Student implements Beat {

    @Override
    void study() {
        // TODO Auto-generated method stub
        System.out.println("好好學習   ");
        
    }
    @Override
    public void goodMouth() {
        // TODO Auto-generated method stub
        System.out.println("給之間留點口德,");
        
    }
    @Override
    public void beatman() {
        // TODO Auto-generated method stub
        //什麼也沒有作
    }
    
}//end


二 抽象類和接口的區別:

    在瞭解接口和抽象類的定義以後,咱們來看如何更好的選擇接口和抽象類之間的區別:

          (1)抽象類能夠提供成員的實現細節,而接口不能。設計抽象時,若是要求提供 的成員的實現細節,可選擇抽象類。

      (2)若是設計抽象時選擇抽象類,在之後的版本中能夠隨意爲抽象類添加新成員。而接口在這方面就沒有那麼靈活,只有修改代碼才能添加成員。

      (3)一個類能夠實現多個接口,但只能繼承一個抽象類,若是要實現相似於多重繼承的效果,可選擇接口。


三 接口和抽象類的總結

    一、 抽象類在java語言中所表示的是一種繼承關係,一個子類只能存在一個父類,可是能夠存在多個接口。

      二、 在抽象類中能夠擁有本身的成員變量和非抽象類方法,可是接口中只能存在靜態的不可變的成員數據(不過通常都不在接口中定義成員數據),並且它的全部方法都是抽象的。

      三、抽象類和接口所反映的設計理念是不一樣的,抽象類所表明的是「is-a」的關係,而接口所表明的是「like-a」的關係。

     四、 抽象類和接口是java語言中兩種不一樣的抽象概念,他們的存在對多態提供了很是好的支持,雖然他們之間存在很大的類似性。可是對於他們的選擇每每反應了您對問題域的理解。只有對問題域的本質有良好的理解,才能作出正確、合理的設計。


初學java請高手指教:


參照了一下幾個比較好的博客:同時也很是感謝這些博主學到了不少!

http://www.cnblogs.com/dolphin0520/p/3811437.html

http://dev.yesky.com/436/7581936.shtml

http://blog.csdn.net/chenssy/article/details/12858267

http://peiquan.blog.51cto.com/7518552/1271610

相關文章
相關標籤/搜索